Java使用volatile關(guān)鍵字的注意事項
Volatile 變量具有 synchronized 的可見性特性,但是不具備原子特性。這就是說線程能夠自動發(fā)現(xiàn) volatile 變量的最新值。Volatile 變量可用于提供線程安全,但是只能應(yīng)用于非常有限的一組用例:多個變量之間或者某個變量的當前值與修改后值之間沒有約束。因此,單獨使用 volatile 還不足以實現(xiàn)計數(shù)器、互斥鎖或任何具有與多個變量相關(guān)的不變式。
volatile關(guān)鍵字是Java中的一種稍弱的同步機制,為什么稱之為弱機制。
在理解這個之前,我們先來看看java在進行同步時必須遵守的兩個機制:
1、可見性:當一個線程修改一個共享變量時,另外一個線程能讀到這個修改的值。
2、原子性:指不可分割,此處指程序執(zhí)行過程中,某操作不能中斷,則為原子操作。
volatile關(guān)鍵字不能保證原子性,只能保證可見性,故在一般情況下不能使用該關(guān)鍵字進行同步操作。但是當滿足以下兩個特定條件時,可以使用其進行同步:
1、運算結(jié)果并不依賴變量的當前值,或者能夠保證只有單一的線程修改變量的值。
2、變量不需要與其他的狀態(tài)變量共同參與不變約束
例:
volatile boolrean flag;
public void close(){
flag = true;
}
public void open(){
while(!flag){
...
}
}
此時open()方法的執(zhí)行依賴flag的值,必須使用同步,但是使用synchronized關(guān)鍵字或者其他方法同步比較繁瑣,此時該情景符合以上兩個條件,故可以使用volatile關(guān)鍵字進行同步。
volatile關(guān)鍵字原理:
被volatile修飾的變量,不會被緩存在寄存器或者其他地方,每次寫直接寫去主內(nèi)存,讀也是從主內(nèi)存讀取。所以可以保證可見性。
以上所述是小編給大家介紹的Java使用volatile關(guān)鍵字的注意事項,希望對大家有所幫助,如果大家有任何疑問請給我留言,小編會及時回復大家的。在此也非常感謝大家對腳本之家網(wǎng)站的支持!
相關(guān)文章
淺談maven 多環(huán)境打包發(fā)布的兩種方式
這篇文章主要介紹了淺談maven 多環(huán)境打包發(fā)布的兩種方式,小編覺得挺不錯的,現(xiàn)在分享給大家,也給大家做個參考。一起跟隨小編過來看看吧2018-08-08
java高并發(fā)ScheduledThreadPoolExecutor與Timer區(qū)別
這篇文章主要為大家介紹了java高并發(fā)ScheduledThreadPoolExecutor與Timer區(qū)別,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進步,早日升職加薪2022-10-10
SpringCloud超詳細講解微服務(wù)網(wǎng)關(guān)Gateway
這篇文章主要介紹了SpringCloud Gateway微服務(wù)網(wǎng)關(guān),負載均衡,熔斷和限流,本文給大家介紹的非常詳細,對大家的學習或工作具有一定的參考借鑒價值,需要的朋友可以參考下2022-07-07

