<rt id="bn8ez"></rt>
<label id="bn8ez"></label>

  • <span id="bn8ez"></span>

    <label id="bn8ez"><meter id="bn8ez"></meter></label>

    中文JAVA技術平等自由協作創造

    Java專題文章博客和開源

    常用鏈接

    統計

    最新評論

    深入探析Java線程鎖機制

      今天在iteye上提了一個關于++操作和線程安全的問題,一位朋友的回答一言點醒夢中人,至此我對Java線程鎖有了更加深刻的認識。在這里也做個總結供大家參考托福代考 托福答案

      先看幾段代碼吧!

      代碼一:

      [java]

      public class TestMultiThread2 implements Runnable{

      private static Object o = new Object();

      private static Integer si = 0;

      private static AtomicInteger flag = new AtomicInteger();

      @Override

      public void run() {

      for(int k=0;k<2000000;k++){

      synchronized(si){

      si++;

      }

      }

      flag.incrementAndGet();

      }

      public static void main(String[] args) throws InterruptedException{

      TestMultiThread2 t1 = new TestMultiThread2();

      TestMultiThread2 t2 = new TestMultiThread2();

      ExecutorService exec1 = Executors.newCachedThreadPool();

      ExecutorService exec2 = Executors.newCachedThreadPool();

      exec1.execute(t1);

      exec2.execute(t2);

      while(true){

      if(flag.intValue()==2){

      System.out.println("si>>>>>"+si);

      break;

      }

      Thread.sleep(50);

      }

      }

      }

      為了方便看,重復的就不插入了,從代碼二到代碼四只插入run()方法中的代碼,其他地方都一樣

      代碼二:

      [java]

      public void run() {

      for(int k=0;k<2000000;k++){

      synchronized(o){

      si++;

      }

      }

      flag.incrementAndGet();

      }

      代碼三:

      [java]

      public void run() {

      for(int k=0;k<2000000;k++){

      synchronized(o){

      si++;

      o = new Object();

      }

      }

      flag.incrementAndGet();

      }

      代碼四:

      [java]

      public void run() {

      for(int k=0;k<2000000;k++){

      synchronized(o){

      si++;

      Object temp = o;

      o = new Object();

      o = temp;

      }

      }

      flag.incrementAndGet();

      }   有了這四段代碼我想問題大概可以說明白了,這里說一下輸出吧。

      代碼一:<4000000

      代碼二:=4000000

      代碼三:<4000000

      代碼四:<4000000(PS:這個結果非常接近4000000)

      這里說明一下我測試中碰到的問題,代碼四一直沒有跑出我想要的結果,主要是開始我設的循環次數太少,其實這里如果要這個現象更加明顯一些可以在中間多new 幾個Object 如下面的代碼五,這樣現象就比較明顯了雅思代考 雅思答案

      代碼五:

      [java]

      public void run() {

      for(int k=0;k<2000000;k++){

      synchronized(o){

      si++;

      Object temp = o;

      for(int m=0;m<10;m++){

      o = new Object();

      }

      o = temp;

      }

      }

      flag.incrementAndGet();

      }

      為什么會出現上面的現象:

      代碼一:當si做++操作后(可以直接看字節碼,這里不貼了)在putstatic之前有幾步操作,就是我們常說的非原子操作,而這時候si已經不是原來的對象了,這樣鎖對另外一個線程來說就失效了,我想代碼三和代碼四就是最好的佐證,代碼四更有說服力。當時因為沒有出現預想的情況困惑了挺久職稱英語代考 職稱英語答案

      其實這里用字節碼來解釋還不是很嚴謹,最好的當然直接是匯編代碼

      如有什么問題還希望各位讀者指正。

    posted on 2013-03-05 17:12 好不容易 閱讀(311) 評論(0)  編輯  收藏


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


    網站導航:
     
    PK10開獎 PK10開獎
    主站蜘蛛池模板: 日韩免费精品视频| 亚洲一区AV无码少妇电影☆| 亚洲AV无码专区国产乱码不卡| 免费国产一级特黄久久| 日批视频网址免费观看| 亚洲二区在线视频| 亚洲成AⅤ人影院在线观看| 免费A级毛片无码视频| 亚洲爆乳AAA无码专区| 亚洲私人无码综合久久网| 一本久到久久亚洲综合| 久久久久久夜精品精品免费啦| 亚洲色中文字幕在线播放| 亚洲精品乱码久久久久久中文字幕 | 亚洲成人激情在线| 日日夜夜精品免费视频| 国产成人精品免费久久久久| 久久久久亚洲精品无码网址色欲 | 免费国产黄网站在线观看动图| 国产国拍亚洲精品mv在线观看 | 午夜两性色视频免费网站| 免费无码一区二区三区蜜桃| 亚洲中文字幕无码爆乳| 亚洲国产精品特色大片观看完整版| 毛片免费在线播放| 久久成人免费大片| 一级毛片在线免费播放| 亚洲另类无码专区首页| 亚洲av成人无码久久精品| 亚洲高清偷拍一区二区三区| 在线看片免费不卡人成视频| 久操视频在线免费观看| 免费国产黄网站在线看| 亚洲丶国产丶欧美一区二区三区| 久久久久亚洲AV片无码下载蜜桃| 国产亚洲精品无码拍拍拍色欲| 日韩成人在线免费视频 | 亚洲男人都懂得羞羞网站| 亚洲无码精品浪潮| 国产免费人视频在线观看免费| 国产v精品成人免费视频400条|