1、volatitle是java的一種輕量級(jí)的并發(fā)機(jī)制
2、被volatitle修飾的關(guān)鍵字也存在并發(fā)問(wèn)題
3、一般的變量在使用時(shí)需要把變量從主內(nèi)存控件加載到工作內(nèi)存空間(可以映射為堆內(nèi)存和棧內(nèi)存模型),工作內(nèi)存空間是線程私有,然后使用外之后才能更新到主內(nèi)存,這期間的操作不是原子操作,所以在高并發(fā)下,存在存儲(chǔ)不一致問(wèn)題。
4、volatitle關(guān)鍵字修飾的變量能夠保證每次在工作空間使用內(nèi)存時(shí)從主內(nèi)存刷新變量的值,改變之后跟新到主內(nèi)存,但是在使用的時(shí)候并不能保證是原子操作,在更新內(nèi)存的之前,可能其他線程已經(jīng)改變了變量 的值了,所以還是存在并發(fā)問(wèn)題。只是比普通的變量“更可靠”罷了。
5、所以volatitle關(guān)鍵字只能保證可見(jiàn)性。我們?nèi)匀恍枰觭ynchronize或者concurrent包里面的類來(lái)保證原子性。
在不符合下面兩條規(guī)則的場(chǎng)景中,仍需要枷鎖:
1、運(yùn)算結(jié)果并不依賴變量當(dāng)前的值,或者保證只有單一線程修改變量的值
2、變量不需要與其他狀態(tài)變量共同參與不變約束。
比如下列場(chǎng)景就是好volatitle關(guān)鍵字:
volatitle boolean isRun;
public void changeState() {
isRun = fasle;
}
public void run() {
while(isRun ) ....
}
當(dāng)changeState方法執(zhí)行的時(shí)候,其他線程的run方法立即停止執(zhí)行。
使用volatitle的第二個(gè)語(yǔ)義是禁止指令重排(指令重排:多條指令交給cpu執(zhí)行的時(shí)候,可以進(jìn)行優(yōu)化,不按順序交給多條電路執(zhí)行),指令重排會(huì)造成同一段代碼多次執(zhí)行的順序不一定相等。
- 原子性、可見(jiàn)性、有序性
有序性:在線程內(nèi)部觀察都是有序的,在一個(gè)線程觀察另一個(gè)線程都是無(wú)序的。前半句是指線程串行語(yǔ)義,后半句是指指重排現(xiàn)象和工作內(nèi)存與主內(nèi)存同步現(xiàn)象。