国产xxxx99真实实拍_久久不雅视频_高清韩国a级特黄毛片_嗯老师别我我受不了了小说

資訊專欄INFORMATION COLUMN

java并發(fā)編程學習之Volatile

thekingisalwaysluc / 2497人閱讀

摘要:但是的語義不足以確保遞增操作的原子性,在多線程的情況下,線程不一定是安全的。檢查某個狀態(tài)標記,以判斷是否退出循環(huán)某個方法這邊和用普通的變量的區(qū)別是,在多線程的情況下,取到后,的值被改變了,判斷會不正確。

多線程為什么是不安全的

這邊簡單的講述一下,參考java并發(fā)編程學習之synchronize(一)

當線程A和線程B同時進入num = num + value;

線程A會把num的值拿出來,放在自己的工作區(qū)間里

線程B也把num的值拿出來,放在自己的工作區(qū)間里

線程A計算完,把值回填到num

這個時候,線程B的值還是原來的,計算完后,把值回填到num,就直接覆蓋了線程A的值

Volatile知識

volatile變量,是稍弱的同步機制,不會被緩存到寄存器或者其他處理器不可見的地方,因此讀取時,總會返回當前的最新值。這個性質(zhì),就是可變性,是Volatile的關(guān)鍵作用之一。但是Volatile的語義不足以確保遞增操作的原子性,在多線程的情況下,線程不一定是安全的。

常用場景:

單例模式(懶漢模式)


我們模擬兩個線程A,B,在還沒創(chuàng)建單例對象的時候,一起進入getInstance方法。

A進入16行,此時singleton為空,時間片結(jié)束。

B也進入16行,獲取到的singleton也是空,時間片結(jié)束。

A進入17行,這邊是類鎖,,B在等待A執(zhí)行完這個代碼塊。

A執(zhí)行完,生成singleton對象。

B繼續(xù)執(zhí)行,這邊注意一下,因為是Volatile具有可見性的特性,此時,他是知道singleton不為空,已經(jīng)被實例化了,于是就不繼續(xù)實例化。如果B不是Volatile變量,那么,他就又實例化singleton,就破壞了單例的結(jié)構(gòu)。

檢查某個狀態(tài)標記,以判斷是否退出循環(huán)

Volatile boolean done;
....
某個方法{
    while(done){
       doSomeThing1();
    }
    doSomeThing2();
}

這邊和用普通的變量的區(qū)別是,在多線程的情況下,取到done后,done的值被改變了,while判斷會不正確。

使用的條件

對變量的寫入操作,不依賴變量的當前值,或者確保單線程更新變量的值

該變量不會和其他變量一起納入不變形條件中

訪問變量時,不需要加鎖

文章版權(quán)歸作者所有,未經(jīng)允許請勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。

轉(zhuǎn)載請注明本文地址:http://specialneedsforspecialkids.com/yun/75160.html

相關(guān)文章

  • java并發(fā)編程習之AQS

    摘要:原理全稱,當線程去獲取資源的時候,會根據(jù)狀態(tài)值來判斷是否有鎖,如果有鎖,則加入到鏈表,鏈表里的線程,通過自旋,判斷資源是否已經(jīng)釋放,如果釋放,則獲取資源。 原理 全稱AbstractQueuedSynchronizer,當線程去獲取資源的時候,會根據(jù)狀態(tài)值state來判斷是否有鎖,如果有鎖,則加入到鏈表,鏈表里的線程,通過自旋,判斷資源是否已經(jīng)釋放,如果釋放,則獲取資源。 AQS結(jié)構(gòu) ...

    Tikitoo 評論0 收藏0
  • java并發(fā)編程習之cas(一)

    摘要:線程把的值放在中。線程執(zhí)行,得到的為。,,獨占鎖,會導致其他所有需要鎖的線程掛起,等待持有鎖的線程釋放鎖。可見性,不保證原子性。樂觀鎖,不適用鎖的情況下實現(xiàn)多線程的變量同步。性能問題在并發(fā)量較高的情況下,如果一直不成功,會一直增加的開銷。 cas原理 cas全稱Compare and swap,比較和交換的意思。原子操作,需要硬件的支持。三個基本操作數(shù):內(nèi)存地址V,舊的預期值A,要修改...

    ConardLi 評論0 收藏0
  • java并發(fā)編程習之synchronize(一)

    摘要:線程安全問題在并發(fā)編程學習之基礎概念提到,多線程的劣勢之一,有個線程安全問題,現(xiàn)在看看下面的例子。那么,該怎么解決呢,很簡單,在方法前加個同步鎖。運行結(jié)果如下有兩種情況,是因為看誰先搶占鎖,但是輸出的算法結(jié)果是正確的。 線程安全問題 在java并發(fā)編程學習之基礎概念提到,多線程的劣勢之一,有個線程安全問題,現(xiàn)在看看下面的例子。 public class NotSafeDemo { ...

    Elle 評論0 收藏0
  • java并發(fā)編程習之再談公平鎖和非公平鎖

    摘要:在并發(fā)編程學習之顯示鎖里有提過公平鎖和非公平鎖,我們知道他的使用方式,以及非公平鎖的性能較高,在源碼分析的基礎上,我們看看和的區(qū)別在什么地方。而非公平鎖直接嘗試獲取鎖。 在java并發(fā)編程學習之顯示鎖Lock里有提過公平鎖和非公平鎖,我們知道他的使用方式,以及非公平鎖的性能較高,在AQS源碼分析的基礎上,我們看看NonfairSync和FairSync的區(qū)別在什么地方。 lock方法 ...

    warkiz 評論0 收藏0
  • java并發(fā)編程習之FutureTask

    摘要:在并發(fā)編程學習之三種線程啟動方式中有提過。是否執(zhí)行結(jié)束,包括正常執(zhí)行結(jié)束或異常結(jié)束。獲取返回值,沒有得到返回值前一直阻塞。運行結(jié)果如下由于任務被取消,所以拋出異常。注意的是,此時線程還在跑,和返回的是。并不能讓任務真正的結(jié)束。 FutureTask 在java并發(fā)編程學習之三種線程啟動方式中有提過。主要的方法如下: cancel(boolean mayInterruptIfRunni...

    BothEyes1993 評論0 收藏0

發(fā)表評論

0條評論

最新活動
閱讀需要支付1元查看
<