Java中的 volatile 關鍵字
1.簡言概括:
volatile關鍵字,是java生態中非常重要的一個關鍵字,主要用於Java多線程操作變量時的可見性。
2.理論知識
2.1 Java內存模型
在使用 volatile 關鍵字之前,我們需要知道對Java的內存有一定的瞭解:
-
Java的內存模型決定了所有變量都保存在主內存(main memory)中,每個線程都有自己獨立的"工作內存”(寄存器),工作內存中保存的是線程運行時所需要的變量的主內存拷貝,即副本。
-
每個線程對變量的操作都在自己的工作內存中,不能直接操作主內存。
-
每個線程不能直接訪問彼此的工作內存,線程之間對於變量的傳遞也需要通過與主內存內容同步。
-
通常情況下,爲了提升性能,一個線程會在自己的“工作內存”中緩存要訪問變量的副本,當線程需要讀某個變量的時候,優先從自己的“工作內存”中查找,如果“工作內存”中有該變量則直接讀取,如果沒有,則需要從“主內存”中同步到自己的“工作內存”中後在讀取。
2.2 volatile 關鍵字的特性
-
Java中,被 volatile 關鍵字修飾的變量,一旦被線程更改,會立即同步到主內存中,線程每次讀取該變量的時候,都是直接從主內存中同步讀取,不管工作內存中有沒有該變量,這樣就保證,每個線程讀取到的變量值是一致的。
-
volatile 具有可見性、有序性、不具備原子性(原子性是 volatile 關鍵字與synchronized、Lock 最大的功能差異)。
3.volatile 關鍵字使用前提與場景
- 使用場景:適用於讀多寫少的場景。
- 其他用法:可用作狀態標誌。
4 實際應用
Java 中 volatile 關鍵字的應用:
JDK中 ,ConcurrentHashMap 的 Entry 的 value 和 next 被聲明爲 volatile ,AtomicLong 中的 value 被聲明爲 volatile,AtomicLong 通過 CAS原理(可以理解爲樂觀鎖)保證了原子性。
5 英文釋義
volatile 在英文中的含義,可參考第一點 “不穩定性的”,所以我們也可以從字面意思上理解,當 Java 讀取到某個被 volatile 修飾的變量時,會認爲它是不穩定,不可靠的,所以會從主內存中讀取。
注:從主內存中讀取,並非直接讀取主內存,而是從主內存中同步到“工作內存”,再獲取工作內存中最新的變量值。