您好,登錄后才能下訂單哦!
前言
要學(xué)習(xí)好Java的多線程,就一定得對(duì)volatile關(guān)鍵字的作用機(jī)制了熟于胸。最近博主看了大量關(guān)于volatile的相關(guān)博客,對(duì)其有了一點(diǎn)初步的理解和認(rèn)識(shí),下面通過(guò)自己的話敘述整理一遍。
有什么用?
volatile主要對(duì)所修飾的變量提供兩個(gè)功能
可見(jiàn)性
防止指令重排序
<br>本篇博客主要對(duì)volatile可見(jiàn)性進(jìn)行探討,以后發(fā)表關(guān)于指令重排序的博文。
什么是可見(jiàn)性?
把JAVA內(nèi)存模型(JMM)展示得很詳細(xì)了,簡(jiǎn)單概括一下
1.每個(gè)Thread有一個(gè)屬于自己的工作內(nèi)存(可以理解為每個(gè)廚師有一個(gè)屬于自己的鐵鍋)
2.所有Thread共用一個(gè)主內(nèi)存(餐廳所有的廚師共用同一個(gè)冰箱)
3.每個(gè)Thread操作數(shù)據(jù)之前都會(huì)去主內(nèi)存中獲取數(shù)據(jù)(廚師炒菜之前都要去冰箱里拿食材)
讀者可思考以下情景:<br> 餐廳來(lái)了一位顧客點(diǎn)了一份紅燒肉,此時(shí)有兩位大廚(假設(shè)大廚之間互不通信),由于互不通信,所以兩位大廚都打開(kāi)冰箱取出食材開(kāi)始炒菜。 最后炒出了兩份紅燒肉,顧客只要一份。為什么會(huì)造成這種結(jié)果?
由于大廚之間沒(méi)有可見(jiàn)性。
將此情景放在JAVA中即是:<br> 線程A從主內(nèi)存中取了一個(gè)變量到工作內(nèi)存中,操作完畢后沒(méi)有及時(shí)放回主內(nèi)存中,于是線程B去取這個(gè)變量已經(jīng)過(guò)期了,取的是線程A操作之前的變量。
如何擁有可見(jiàn)性?
先介紹一下Java內(nèi)存模型中定義的8種工作內(nèi)存與主內(nèi)存之間的原子操作
讀取賦值一個(gè)普通變量的情況
發(fā)起read操作到write操作套流程的時(shí)間里,線程2隨時(shí)都有可能對(duì)這個(gè)主內(nèi)存對(duì)象發(fā)起第二套操作
有什么危害呢?
假設(shè)主內(nèi)存中有一個(gè)
int a=0;
線程1和線程2分別執(zhí)行一次,理想狀態(tài)下最終a的值為2.
a++;
線程1在執(zhí)行了assign操作之后變量a的真實(shí)值已經(jīng)從0變成了1,但是這個(gè)過(guò)程發(fā)生在工作內(nèi)存中對(duì)其他線程不可見(jiàn),若線程2此時(shí)對(duì)變量a的操作,讀取到的值仍然為0,因?yàn)闆](méi)有可見(jiàn)性,線程2的操作也僅僅是重復(fù)了線程1的操作,再次讓a從0變成了1。并沒(méi)有達(dá)到期望的a=2。
讀取賦值一個(gè)volatile變量的情況
操作更嚴(yán)格:
use之前不能被read&load
assign之后必須緊跟store&write
也就是說(shuō) read-load-use 和 assign-store-write成為了兩個(gè)不可分割的原子操作
盡管這時(shí)候在use和assign之間依然有一段真空期,有可能變量會(huì)被其他線程讀取,但是無(wú)論在哪一個(gè)時(shí)間點(diǎn)主內(nèi)存的變量和任一工作內(nèi)存的變量的值都是相等的。這個(gè)特性就導(dǎo)致了volatile變量不適合參與到依賴當(dāng)前值的運(yùn)算,如自增。 那么依靠可見(jiàn)性的特點(diǎn)volatile可以用在哪些地方呢? 《Java虛擬機(jī)》提到:
運(yùn)算結(jié)果并不依賴變量的當(dāng)前值(即結(jié)果對(duì)產(chǎn)生中間結(jié)果不依賴),或者能夠確保只有單一的線程修改變量的值
通常volatile用做保存某個(gè)狀態(tài)的boolean值。
以上所述是小編給大家介紹的Java并發(fā)編程-volatile可見(jiàn)性詳解整合,希望對(duì)大家有所幫助,如果大家有任何疑問(wèn)請(qǐng)給我留言,小編會(huì)及時(shí)回復(fù)大家的。在此也非常感謝大家對(duì)億速云網(wǎng)站的支持!
免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如果涉及侵權(quán)請(qǐng)聯(lián)系站長(zhǎng)郵箱:is@yisu.com進(jìn)行舉報(bào),并提供相關(guān)證據(jù),一經(jīng)查實(shí),將立刻刪除涉嫌侵權(quán)內(nèi)容。