volatitle關(guān)鍵字

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)象。
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書(shū)系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容