posts - 12, comments - 8, trackbacks - 0, articles - 5
            BlogJava :: 首頁 :: 新隨筆 :: 聯(lián)系 :: 聚合  :: 管理

          volatile的適用場景

          Posted on 2010-11-18 14:45 楊羅羅 閱讀(1716) 評(píng)論(0)  編輯  收藏 所屬分類: java.thread

          volatile保證線程間的數(shù)據(jù)是可見的(共享的),但不保證數(shù)據(jù)同步

          volatile相當(dāng)于synchronized的弱實(shí)現(xiàn),也就是說volatile實(shí)現(xiàn)了類似synchronized的語義,卻又沒有鎖機(jī)制。它確保對(duì)volatile字段的更新以可預(yù)見的方式告知其他的線程。
          volatile包含以下語義:
          (1)Java 存儲(chǔ)模型不會(huì)對(duì)valatile指令的操作進(jìn)行重排序:這個(gè)保證對(duì)volatile變量的操作時(shí)按照指令的出現(xiàn)順序執(zhí)行的。
          (2)volatile變量不會(huì)被緩存在寄存器中(只有擁有線程可見)或者其他對(duì)CPU不可見的地方,每次總是從主存中讀取volatile變量的結(jié)果。也就是說對(duì)于volatile變量的修改,其它線程總是可見的,并且不是使用自己線程棧內(nèi)部的變量。也就是在happens-before法則中,對(duì)一個(gè)valatile變量的寫操作后,其后的任何讀操作理解可見此寫操作的結(jié)果。

          volatile變量的特性不錯(cuò),但是volatile并不能保證線程安全的,也就是說volatile字段的操作不是原子性的,volatile變量只能保證可見性(一個(gè)線程修改后其它線程能夠理解看到此變化后的結(jié)果),要想保證原子性,目前為止只能加鎖!

          volatile通常在下面的場景:

          volatile boolean done = false;



              
          while( ! done ){
                  dosomething();
              }

           應(yīng)用volatile變量的三個(gè)原則:

          (1)寫入變量不依賴此變量的值,或者只有一個(gè)線程修改此變量

          (2)變量的狀態(tài)不需要與其它變量共同參與不變約束

          (3)訪問變量不需要加鎖

          主站蜘蛛池模板: 玉林市| 健康| 平乐县| 南陵县| 临安市| 金阳县| 石泉县| 襄汾县| 岚皋县| 鹤壁市| 轮台县| 岳阳市| 景德镇市| 天长市| 德令哈市| 兰溪市| 泸西县| 平和县| 洛阳市| 丹凤县| 沙坪坝区| 新乐市| 临城县| 平和县| 漠河县| 绥化市| 巴彦淖尔市| 新兴县| 黔江区| 绥棱县| 巧家县| 平度市| 滁州市| 班戈县| 吴川市| 大石桥市| 惠水县| 安远县| 大英县| 安多县| 永清县|