volatile是j**a虛擬機器提供的輕量級的同步機制(「乞丐版」的synchronized)
保證可見性
不保證原子性
禁止指令重排
可見性指當多個執行緒訪問同乙個變數時,如果其中乙個執行緒修改了這個變數的值,其他執行緒能夠立即看得到修改的值
驗證可見性demo:
import j**a.util.concurrent.timeunit;
class mydata
}public class volatiledemo catch (interruptedexception e)
mydata.addto60();
system.out.println(thread.currentthread().getname() + "\t updated number: " + mydata.number);
}, "aaa").start();
while (mydata.number == 0) {}
system.out.println(thread.currentthread().getname() + "\t mission is over");}}
結果:
aaa come in
main mission is over
aaa updated number: 60
不保證原子性原子性:程式中的所有操作是不可中斷的,要麼全部執行成功要麼全部執行失敗不保證原子性正是volatile輕量級的體現,多個執行緒對volatile修飾的變數進行操作時,會出現容易出現寫覆蓋的情況(i++)
驗證不保證原子性demo:
import j**a.util.concurrent.timeunit;
import j**a.util.concurrent.atomic.atomicinteger;
class mydata
}public class volatiledemo
}, string.valueof(i)).start();
}while (thread.activecount() > 2)
system.out.println(thread.currentthread().getname() + "\t finally number value: " + mydata.number);}}
結果:
main finally number value: 19109
解決不保證原子性問題:atomic
import j**a.util.concurrent.timeunit;
import j**a.util.concurrent.atomic.atomicinteger;
class mydata
atomicinteger atomicinteger = new atomicinteger();
public void addatmic()
}public class volatiledemo
}, string.valueof(i)).start();
}while (thread.activecount() > 2)
system.out.println(thread.currentthread().getname() + "\t finally number value: " + mydata.number);
system.out.println(thread.currentthread().getname() + "\t atomicinteger type,finally number value: "
+ mydata.atomicinteger);}}
結果:
main finally number value: 19746
main atomicinteger type,finally number value: 20000
禁止指令重排指令重排:為了提高程式執行效率,編譯器可能會對輸入指令進行重新排序,即程式中各個語句的執行先後順序同**中的順序不一定一致。(但是它會保證單執行緒程式最終執行結果和**順序執行的結果是一致的,它忽略了資料的依賴性)源** -> 編譯器優化重排 -> 指令並行重排 -> 記憶體系統重排 -> 最終執行指令
volatile能夠實現禁止指令重排的底層原理:
應用場景:
volatile關鍵字解析
計算機執行程式時,每條指令都是在cpu中執行的,執行指令過程中,涉及到的資料的讀寫操作,程式執行過程中臨時資料都儲存在主存 物理記憶體 中,由於cpu的執行速度很快,所以資料的讀取和向記憶體中的的寫入相比較cpu的執行速度要慢很多,因此任何時候對資料的操作通過記憶體互動都會降低指令的執行速度,所以c...
volatile關鍵字解析
volatile 1.保證可見性 2.禁止重排序 我們先來看看乙個問題,關於i i 1的問題。首先,他不是乙個原子性的操作,我們通常將不可拆分的操作稱為原子操作 而i i 1需要先在主存中取得i的值,之後複製到快取記憶體之中,cpu再從快取記憶體中讀取並計算之後存入快取記憶體,最後把值再存入記憶體中...
volatile關鍵字解析(一)
引起執行緒併發問題,可以簡單的總結為以下三條 原子性問題 什麼是原子性?原子性,即乙個操作或者多個操作,要麼全部執行並且執行過程中不會被任何因素打斷,要麼全部都不執行。如常見的銀行轉賬 count 操作等,都必須具備原子性才能保證不出現意外。a向b轉賬100元,需要保證兩步 a賬戶減100,b賬戶加...