少年阿賓

          那些青春的歲月

            BlogJava :: 首頁(yè) :: 聯(lián)系 :: 聚合  :: 管理
            500 Posts :: 0 Stories :: 135 Comments :: 0 Trackbacks
          1、volatile

          volatile字段的寫入操作happens-before于每一個(gè)后續(xù)的同一個(gè)字段的讀操作。

          因?yàn)閷?shí)際上putremove等操作也會(huì)更新count的值,所以當(dāng)競(jìng)爭(zhēng)發(fā)生的時(shí)候,volatile的語(yǔ)義可以保證寫操作在讀操作之前,也就保證了寫操作對(duì)后續(xù)的讀操作都是可見(jiàn)的,這樣后面get的后續(xù)操作就可以拿到完整的元素內(nèi)容。

          使用建議:在兩個(gè)或者更多的線程訪問(wèn)的成員變量上使用volatile。當(dāng)要訪問(wèn)的變量已在synchronized代碼塊中,或者為常量時(shí),不必使用。


          volatile實(shí)際上只有在多cpu或者多核下才有用。當(dāng)讀取數(shù)據(jù)時(shí),他不會(huì)cache緩存中讀取,而是強(qiáng)制從內(nèi)從中讀取,這樣讀到的就是最新值。當(dāng)寫入數(shù)據(jù)的時(shí)候,會(huì)直接將數(shù)據(jù)寫入內(nèi)存中,并刷新所有其他核中的緩存,這樣其他核看到的就是最新寫入的值,也就是說(shuō),其他線程就看到了最新寫入的值。

          一般說(shuō)來(lái),volatile用在如下的幾個(gè)地方:

          1、中斷服務(wù)程序中修改的供其它程序檢測(cè)的變量需要加volatile;

          2、多任務(wù)環(huán)境下各任務(wù)間共享的標(biāo)志應(yīng)該加volatile;

          3、存儲(chǔ)器映射的硬件寄存器通常也要加volatile說(shuō)明,因?yàn)槊看螌?duì)它的讀寫都可能由不同意義;


          聲明方式為  volatile declaration


          備注
          系統(tǒng)總是在 volatile 對(duì)象被請(qǐng)求的那一刻讀取其當(dāng)前值,即使上一條指令從同一對(duì)象請(qǐng)求值。而且,該對(duì)象的值在賦值時(shí)立即寫入。

          volatile 修飾符通常用于由多個(gè)線程訪問(wèn)而不使用 lock 語(yǔ)句來(lái)序列化訪問(wèn)的字段。使用 volatile 修飾符能夠確保一個(gè)線程檢索由另一線程寫入的最新值。


          posted on 2015-01-18 21:08 abin 閱讀(390) 評(píng)論(0)  編輯  收藏 所屬分類: volatile

          只有注冊(cè)用戶登錄后才能發(fā)表評(píng)論。


          網(wǎng)站導(dǎo)航:
           
          主站蜘蛛池模板: 灵宝市| 丰镇市| 承德市| 东源县| 东辽县| 庆阳市| 海南省| 文安县| 武穴市| 工布江达县| 汤原县| 老河口市| 通海县| 平山县| 本溪市| 通化市| 隆尧县| 沁源县| 鄂温| 栾川县| 龙山县| 龙泉市| 龙井市| 长海县| 庄河市| 广河县| 京山县| 霍州市| 巫溪县| 巢湖市| 泾源县| 连江县| 达日县| 缙云县| 登封市| 乐山市| 高陵县| 会东县| 当雄县| 昌吉市| 若羌县|