熱點推薦:
您现在的位置: 電腦知識網 >> 編程 >> Java編程 >> Java高級技術 >> 正文

java多線程的volatile關鍵字

2013-11-23 19:51:19  來源: Java高級技術 

  以前一直沒在意一直以為volatile修飾了就高枕無憂了但其實不然最簡單的一個場景

  public class Counter {

  public volatile static int count = ;

  public static void inc() {

  //這裡延遲毫秒使得結果明顯

  try {

  Threadsleep();

  } catch (InterruptedException e) {

  }

  count++;

  }

  public static void main(String[] args) {

  //同時啟動個線程去進行i++計算看看實際結果

  for (int i = ; i < ; i++) {

  new Thread(new Runnable() {

  @Override

  public void run() {

  Counterinc();

  }

  })start();

  }

  //這裡每次運行的值都有可能不同可能為

  Systemoutprintln(運行結果:unt= + unt);

  }

  }

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

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

  例如假如線程線程 在進行readload 操作中發現主內存中count的值都是那麼都會加載這個最新的值

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

  線程由於已經進行readload操作在進行運算之後也會更新主內存count的變量值為

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


From:http://tw.wingwit.com/Article/program/Java/gj/201311/27567.html
    推薦文章
    Copyright © 2005-2013 電腦知識網 Computer Knowledge   All rights reserved.