java關鍵字Voatile的修復 jdk 1.5

在Java 5中之前,它是一個備受爭議的關鍵字,因爲在程序中使用它往往會導致出人意料的結果(尤其是在JDK 1.5之前的Java的中無法安全地使用DCL(雙鎖家檢測)來實現單例模式的原因)。在Java 5中之後,揮發性關鍵字才得以重獲生機。

    在Java5中之前雖然揮發性不允許揮發性變量之間重排序,但是卻允許波動和不同變量重排序,這就導致了很多出人意料結果。而Java5中之後揮發性變量和不同變量之間也不允許重排序才使得,各種意料結果得到解決(在Java的以前的內存模型當中沒有loadstore和loadload這類內存屏障導致揮發​​性變量可以和普通變量可以重排序,所以就產生了各種問題,而Java5中之後有了這類內存屏障所以揮發性和揮發性以及揮發性和普通變量之間不可以重排序(具體:普-V寫和V讀 - 普不可以重排序),加強了易揮發的語義,導致揮發性可以正確使用又因爲在86杯。禁止讀 - 讀,讀 - 寫,寫。 - 寫操作的重排序,所以各種內存屏障都可以忽略掉最後只剩下storeload這個內存屏障也就是我們最後看到的鎖定彙編指令),如下圖在Java5中之前使用揮發會導致錯誤

線程:A
int a = 0;
volatile boolean flag = false;
public void writer() 
{
    a = 1;       // 1
    flag = true;   // 2
}

線程:B
public void reader() 
{
    if (flag) {    // 3
    int i = a;         // 4
    ……
}
如圖所示java5之前volatile與普通變量進行了重排序導致程序發生錯誤。

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