《java多线程编程实战指南 核心篇》读书笔记二
1. 競(jìng)態(tài)
對(duì)于同樣的輸入,程序的輸出有時(shí)候正確而有時(shí)候卻是錯(cuò)誤的。這種一個(gè)計(jì)算結(jié)果的正確性與時(shí)間有關(guān)的現(xiàn)象就被稱為競(jìng)態(tài)(RaceCondition)
導(dǎo)致競(jìng)態(tài)的常見原因是多個(gè)線程在沒有采取任何措施的情況下并發(fā)更新、讀取同一個(gè)共享變量。
競(jìng)態(tài)往往伴隨著數(shù)據(jù)的臟讀問(wèn)題,即線程讀取到一個(gè)過(guò)時(shí)的數(shù)據(jù);丟失更新問(wèn)題,即一個(gè)線程丟失數(shù)據(jù)所做的更新沒有體現(xiàn)在后續(xù)其他線程對(duì)該數(shù)據(jù)的讀取上。
?
不同線程各自訪問(wèn)各自的那一部分局部變量(包括形式參數(shù)和方法體內(nèi)定義的變量),所以局部變量不會(huì)導(dǎo)致競(jìng)態(tài)。
線程安全?如果一個(gè)類在單線程環(huán)境下運(yùn)行正常,并且在多線程環(huán)境下,不做任何改變的情況下也能正常運(yùn)行,那我們就稱其是線程安全的,相應(yīng)的我們稱這個(gè)類具有線程安全性。
非線程安全?反之我們則為非線程安全。
?
?2.? 線程安全問(wèn)題
線程安全問(wèn)題概括來(lái)說(shuō)表現(xiàn)為3個(gè)方面: 原子性(atomic),可見性(visibility)和有序性(ordering)。
?
? 線程終止與可見性
public class ThreadJoinVisibility {static int data = 0;public static void main(String[] args) {Thread thread = new Thread(){@Overridepublic void run(){data = 1;}};thread.start();try {/*** java語(yǔ)言規(guī)范保證一個(gè)線程終止后該線程對(duì)共享變量的更新對(duì)* 于調(diào)用該線程的join方法的線程而言是可見的。*/thread.join();} catch (InterruptedException e) {e.printStackTrace();}System.out.println(data);} }?
3. 編譯器可能改變兩個(gè)操作的先后順序;處理器可能不是完全依照程序的目標(biāo)代碼所指定的順序執(zhí)行指令;另外,一個(gè)處理器上執(zhí)行的多個(gè)操作,從其他處理器的角度來(lái)看其順序可能與目標(biāo)代碼所指定的順序不一致。這種現(xiàn)象就叫做重排序(Reordering).
? 4. 指令重排序
? ?從底層的角度來(lái)說(shuō),禁止重排序是通過(guò)調(diào)用處理器提供相應(yīng)的指令(內(nèi)存屏障 memory barrier)來(lái)實(shí)現(xiàn)的。 volatile關(guān)鍵字, synchronized關(guān)鍵字都能夠?qū)崿F(xiàn)有序性。
?
5. 上下文切換(context switch)
? ? 在某種程度上,可以被看做多個(gè)線程共享同一個(gè)處理器的產(chǎn)物,它是多線程編程中的一個(gè)重要概念。
6. 一次只能夠被一個(gè)線程占用的資源被稱為排他性(Exclusive)資源. 常見的排他性資源包括處理器,數(shù)據(jù)庫(kù)連接,文件等。
7. ?同一時(shí)間內(nèi),處于運(yùn)行狀態(tài)(即生命周期狀態(tài)為RUNNABLE的RUNNING子狀態(tài)的線程)的線程數(shù)量越多,我們就稱并發(fā)的程度越高,簡(jiǎn)稱高并發(fā)。
?
《新程序員》:云原生和全面數(shù)字化實(shí)踐50位技術(shù)專家共同創(chuàng)作,文字、視頻、音頻交互閱讀總結(jié)
以上是生活随笔為你收集整理的《java多线程编程实战指南 核心篇》读书笔记二的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
 
                            
                        - 上一篇: 《java多线程编程实战指南 核心篇》读
- 下一篇: 《java多线程编程实战指南 核心篇》读
