方偉的博客
          j2ee技術、網絡、web等,同名的人真多,我的QQ是20025404
          posts - 21,comments - 14,trackbacks - 0
          以前一直沒在意,一直以為volatile修飾了就高枕無憂了,但其實不然,最簡單的一個場景:
          public class Counter {
           
              public volatile static int count = 0;
           
              public static void inc() {
           
                  //這里延遲1毫秒,使得結果明顯
                  try {
                      Thread.sleep(1);
                  } catch (InterruptedException e) {
                  }
           
                  count++;
              }
           
              public static void main(String[] args) {
           
                  //同時啟動1000個線程,去進行i++計算,看看實際結果
           
                  for (int i = 0; i < 1000; i++) {
                      new Thread(new Runnable() {
                          @Override
                          public void run() {
                              Counter.inc();
                          }
                      }).start();
                  }
           
                  //這里每次運行的值都有可能不同,可能為1000
                  System.out.println("運行結果:Counter.count=" + Counter.count);
              }
          }

           這里運行結果依然不是期望的1000,主要原因簡單解釋如下:
           

          對于volatile修飾的變量,jvm虛擬機只是保證從主內存加載到線程工作內存的值是最新的

          例如假如線程1,線程2 在進行read,load 操作中,發現主內存中count的值都是5,那么都會加載這個最新的值

          在線程1堆count進行修改之后,會write到主內存中,主內存中的count變量就會變為6

          線程2由于已經進行read,load操作,在進行運算之后,也會更新主內存count的變量值為6

          導致兩個線程及時用volatile關鍵字修改之后,還是會存在并發的情況。

          posted on 2013-05-30 15:26 方偉的博客 閱讀(319) 評論(0)  編輯  收藏 所屬分類: J2EE相關

          只有注冊用戶登錄后才能發表評論。


          網站導航:
           
          主站蜘蛛池模板: 隆林| 长宁区| 宜兰县| 崇义县| 中牟县| 咸宁市| 山西省| 韩城市| 乌恰县| 盐边县| 犍为县| 利川市| 佛冈县| 古蔺县| 海丰县| 长岛县| 兰溪市| 肥西县| 怀来县| 怀柔区| 会宁县| 都江堰市| 游戏| 井研县| 东乌珠穆沁旗| 宁海县| 东兴市| 遵化市| 鹤壁市| 广平县| 泗水县| 买车| 乌拉特前旗| 全南县| 怀集县| 平南县| 仁寿县| 晴隆县| 百色市| 兰考县| 泗阳县|