溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務(wù)條款》

每個學(xué)習(xí)多線程的Java程序員都必須掌握的volatile關(guān)鍵字解析

發(fā)布時間:2020-08-05 09:25:33 來源:網(wǎng)絡(luò) 閱讀:343 作者:Java_老男孩 欄目:編程語言

volatile基本介紹

volatile可以看成是synchronized的一種輕量級的實現(xiàn),但volatile并不能完全代替synchronized,volatile有synchronized可見性的特性,但沒有synchronized原子性的特性??梢娦约从胿olatile關(guān)鍵字修飾的成員變量表明該變量不存在工作線程的副本,線程每次直接都從主內(nèi)存中讀取,每次讀取的都是最新的值,這也就保證了變量對其他線程的可見性。另外,使用volatile還能確保變量不能被重排序,保證了有序性。

volatile只用修飾一個成員變量,如:private volatile balance;

volatile比synchronized編程更容易且開銷更小,但具有一點的使用局限性,使用要相當(dāng)小心,不能當(dāng)鎖使用。volatile不會像synchronized一樣阻塞程序,如果是讀操作遠(yuǎn)多于寫操作的情況可以建議使用volatile,它會有更好的性能。

volatile使用場景

如果正確使用volatile的話,必須依賴下以下種條件:

1、對變量的寫操作不依賴當(dāng)前變量的值;

2、該變量沒有包含在其他變量的不變式中。

第1個條件就說明了volatile不是原子性的操作,不能使用n++類似的計數(shù)器,它不是線程安全的。

一、狀態(tài)的改變

有些場景肯定會有狀態(tài)的改變,完成一個主線程的停止等。首先我們開啟了一個無限循環(huán)的主線程,判斷變量isStop變量是否為true,如果true的話就退出程序,否則就一直循環(huán),所以這個isStop的值是別的線程改變的。

每個學(xué)習(xí)多線程的Java程序員都必須掌握的volatile關(guān)鍵字解析

上面這段程序如果不加volatile的話會一直卡在循環(huán),此時的線程拿到的值永遠(yuǎn)為false,加了volatile3秒后就輸出stop,所以這段程序很好的解釋了可見性的特點。

二、讀多寫少的情況

假設(shè)這樣一種場景,有N個線程在讀取變量的值,只有一個線程寫變量的值,這時候就能保證讀線程的可見性,又能保證寫線程的線程安全問題。

像n++不是原子類的操作,其實可以通過synchronized對寫方法鎖住,再用volatile修飾變量,這樣就保證了讀線程對變量的可見性,又保證了變量的原子性。

每個學(xué)習(xí)多線程的Java程序員都必須掌握的volatile關(guān)鍵字解析

如果n不加volatile,程序?qū)⒁恢毖h(huán),不能輸出stop,也就是此時的線程拿到的值永遠(yuǎn)為0。當(dāng)然不加volatile,對獲取n的方法進(jìn)行synchronized修飾也是能及時獲取最新值的,但是性能會遠(yuǎn)低于volatile。


本文的重點是你有沒有收獲與成長,其余的都不重要,希望讀者們能謹(jǐn)記這一點。同時我經(jīng)
過多年的收藏目前也算收集到了一套完整的學(xué)習(xí)資料,希望對想成為架構(gòu)師的朋友有一定的參
考和幫助

需要更詳細(xì)思維導(dǎo)圖和以下資料的可以加一下技術(shù)交流分享群:“708 701 457”免費獲取
每個學(xué)習(xí)多線程的Java程序員都必須掌握的volatile關(guān)鍵字解析
每個學(xué)習(xí)多線程的Java程序員都必須掌握的volatile關(guān)鍵字解析
每個學(xué)習(xí)多線程的Java程序員都必須掌握的volatile關(guān)鍵字解析
每個學(xué)習(xí)多線程的Java程序員都必須掌握的volatile關(guān)鍵字解析

向AI問一下細(xì)節(jié)

免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點不代表本網(wǎng)站立場,如果涉及侵權(quán)請聯(lián)系站長郵箱:is@yisu.com進(jìn)行舉報,并提供相關(guān)證據(jù),一經(jīng)查實,將立刻刪除涉嫌侵權(quán)內(nèi)容。

AI