Java 中的關鍵字 (1)—— Java volatile

Java中的 volatile 關鍵字

1.簡言概括:

volatile關鍵字,是java生態中非常重要的一個關鍵字,主要用於Java多線程操作變量時的可見性

2.理論知識

2.1 Java內存模型

在使用 volatile 關鍵字之前,我們需要知道對Java的內存有一定的瞭解:

  1. Java的內存模型決定了所有變量都保存在主內存(main memory)中,每個線程都有自己獨立的"工作內存”(寄存器),工作內存中保存的是線程運行時所需要的變量的主內存拷貝,即副本。

  2. 每個線程對變量的操作都在自己的工作內存中,不能直接操作主內存。

  3. 每個線程不能直接訪問彼此的工作內存,線程之間對於變量的傳遞也需要通過與主內存內容同步。

  4. 通常情況下,爲了提升性能,一個線程會在自己的“工作內存”中緩存要訪問變量的副本,當線程需要讀某個變量的時候,優先從自己的“工作內存”中查找,如果“工作內存”中有該變量則直接讀取,如果沒有,則需要從“主內存”中同步到自己的“工作內存”中後在讀取。

2.2 volatile 關鍵字的特性

  1. Java中,被 volatile 關鍵字修飾的變量,一旦被線程更改,會立即同步到主內存中,線程每次讀取該變量的時候,都是直接從主內存中同步讀取,不管工作內存中有沒有該變量,這樣就保證,每個線程讀取到的變量值是一致的。

  2. volatile 具有可見性、有序性、不具備原子性(原子性是 volatile 關鍵字與synchronized、Lock 最大的功能差異)。

3.volatile 關鍵字使用前提與場景

  1. 使用場景:適用於讀多寫少的場景。
  2. 其他用法:可用作狀態標誌。

4 實際應用

Java 中 volatile 關鍵字的應用:

JDK中 ,ConcurrentHashMap 的 Entry 的 value 和 next 被聲明爲 volatile ,AtomicLong 中的 value 被聲明爲 volatile,AtomicLong 通過 CAS原理(可以理解爲樂觀鎖)保證了原子性。

5 英文釋義

volatile 在英文中的含義,可參考第一點 “不穩定性的”,所以我們也可以從字面意思上理解,當 Java 讀取到某個被 volatile 修飾的變量時,會認爲它是不穩定,不可靠的,所以會從主內存中讀取。

注:從主內存中讀取,並非直接讀取主內存,而是從主內存中同步到“工作內存”,再獲取工作內存中最新的變量值。

在這裏插入圖片描述

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章