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

          日歷

          <2010年11月>
          31123456
          78910111213
          14151617181920
          21222324252627
          2829301234
          567891011

          搜索

          •  

          最新評論

          volatile的適用場景

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

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

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

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

          volatile通常在下面的場景:

          volatile boolean done = false;



              
          while( ! done ){
                  dosomething();
              }

           應用volatile變量的三個原則:

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

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

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

          主站蜘蛛池模板: 惠来县| 苏尼特右旗| 黔东| 新昌县| 平湖市| 利辛县| 津市市| 永春县| 育儿| 甘洛县| 拜泉县| 宜兰市| 固原市| 新营市| 平阴县| 买车| 德兴市| 深水埗区| 增城市| 澜沧| 汉沽区| 原阳县| 合川市| 波密县| 阜康市| 永清县| 河津市| 五河县| 鄂伦春自治旗| 深水埗区| 洞口县| 璧山县| 呼伦贝尔市| 忻城县| 汉源县| 镇江市| 固原市| 郓城县| 海原县| 罗甸县| 龙门县|