volatile的特點與應用

2021-08-20 01:57:44 字數 754 閱讀 5811

可見性

如果對宣告了volatile變數進行寫操作時,jvm會向處理器傳送一條lock字首的指令,將這個變數所在快取行的資料寫會到系統記憶體

有序性lock字首指令實際上相當於乙個記憶體屏障(也成記憶體柵欄),它確保指令重排序時不會把其後面的指令排到記憶體屏障之前的位置,也不會把前面的指令排到記憶體屏障的後面;即在執行到記憶體屏障這句指令時,在它前面的操作已經全部完成。

不保證原子性

單例模式中的double check

class singleton

public static singleton getinstance()

}return instance;}}

為什麼要使用volatile 修飾instance?

主要在於instance = new singleton()這句,這並非是乙個原子操作,事實上在 jvm 中這句話大概做了下面 3 件事情:

1.給 instance 分配記憶體

2.呼叫 singleton 的建構函式來初始化成員變數

3.將instance物件指向分配的記憶體空間(執行完這步 instance 就為非 null 了)。

但是在 jvm 的即時編譯器中存在指令重排序的優化。也就是說上面的第二步和第三步的順序是不能保證的,最終的執行順序可能是 1-2-3 也可能是 1-3-2。如果是後者,則在 3 執行完畢、2 未執行之前,被執行緒二搶占了,這時 instance 已經是非 null 了(但卻沒有初始化),所以執行緒二會直接返回 instance,然後使用,然後順理成章地報錯。

volatile的應用與原理

背景 多執行緒開發中,不少見 volatile,其很典型的標記就是可見性,接下來一起了解一下其原理吧 定義volatile 是輕量級的 synchronized,它在多處理器開發中保證了共享變數的 可見性 可見性的意思是乙個執行緒修改乙個共享變數時,另外乙個執行緒能讀到這個修改的值 volatile...

定位的分類 特點與應用

一 相對定位 position relative 特點 不脫離標準文件流,可以調整元素 以原來的位置為參考點 二 絕對定位 position absolute 特點 1 脫離標準文件流,不在頁面佔位置 2 層級提高,壓蓋現象 1 單獨給乙個盒子設定絕對定位,以根元素頁面左上角為參考點 2 相對於最近...

volatile的應用場景

下面先來想一下單例模式中的雙端檢查 public class singleton private static singleton getinstance return instance 思考這樣乙個場景 有兩個執行緒,執行緒a和執行緒b,執行緒a是初次訪問getinstance 方法,此時在第乙個...