並發三大特性
原子性、可見性、有序性
1. 原子性
含義
一個或多個操作,要么全部執行且在執行過程中不被任何因素打斷,要么全部不執行。
在 Java 中,對基本數據類型的變量的讀取和賦值操作是原子性操作。
重要
不采取任何的原子性保障措施的自增操作並不是原子性的。
如何保證原子性
- 通過 synchronized 關鍵字定義同步代碼塊或者同步方法保障原子性。
- 通過 Lock 接口保障原子性。
- 通過 Atomic 類型保障原子性。
2. 可見性
含義
當一個線程修改了共享變量的值,其他線程能夠看到修改的值。
Java 內存模型是通過在變量修改后將新值同步回主內存,在變量讀取前從主內存刷新變量值這種依賴主內存作為傳遞媒介的方法來實現可見性的。
volatile 變量和普通變量區別
普通變量與 volatile 變量的區別是 volatile 的特殊規則保證了新值能立即同步到主內存,以及每次使用前立即從主內存刷新,因此我們可以說 volatile 保證了多線程操作時變量的可見性,而普通變量則不能保證這一點。
如何保證可見性
- 通過 volatile 關鍵字標記內存屏障保證可見性。
- 通過 synchronized 關鍵字定義同步代碼塊或者同步方法保障可見性。
- 通過 Lock 接口保障可見性。
- 通過 Atomic 類型保障可見性。
- 通過 final 關鍵字保障可見性
3. 有序性
含義
即程序執行的順序按照代碼的先后順序執行。
JVM 存在指令重排,所以存在有序性問題。
如何保證有序性
- 通過 synchronized關鍵字 定義同步代碼塊或者同步方法保障可見性。
- 通過 Lock接口 保障可見性。