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