方偉的博客
          j2ee技術、網(wǎng)絡、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 操作中,發(fā)現(xiàn)主內存中count的值都是5,那么都會加載這個最新的值

          在線程1堆count進行修改之后,會write到主內存中,主內存中的count變量就會變?yōu)?

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

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

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

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


          網(wǎng)站導航:
           
          主站蜘蛛池模板: 玉田县| 甘孜| 二连浩特市| 岳普湖县| 民丰县| 衡阳县| 虞城县| 鹿泉市| 长乐市| 仙游县| 广丰县| 龙门县| 成武县| 霍邱县| 永嘉县| 外汇| 麻栗坡县| 普安县| 浠水县| 公主岭市| 印江| 高唐县| 黎城县| 桐梓县| 锦州市| 邛崃市| 土默特右旗| 若羌县| 十堰市| 平谷区| 马山县| 屏东县| 高淳县| 卢氏县| 黔江区| 礼泉县| 金塔县| 阿克陶县| 观塘区| 温宿县| 仲巴县|