沉睡森林@漂在北京

          本處文章除注明“轉(zhuǎn)載”外均為原創(chuàng),轉(zhuǎn)載請(qǐng)注明出處。

            BlogJava :: 首頁(yè) :: 新隨筆 :: 聯(lián)系 :: 聚合  :: 管理 ::
            152 隨筆 :: 4 文章 :: 114 評(píng)論 :: 0 Trackbacks
            今天看到一段關(guān)于synchronized的小代碼,比較有意思。當(dāng)將S1的static去掉,這個(gè)死鎖便解開(kāi)了。其實(shí)也很好理解,線(xiàn)程1進(jìn)入后鎖住S1,并且等待了500,在等待時(shí)線(xiàn)程2來(lái)了,鎖住了S2。線(xiàn)程1的500過(guò)了后接著鎖住S2開(kāi)始下面的輸出,但是S2被線(xiàn)程2鎖住不放;同樣線(xiàn)程2鎖住了S2,接著去取S1的控制權(quán),但是線(xiàn)程1卻握著不放。死鎖便產(chǎn)生了。S1和S2都是static關(guān)鍵字修飾,他們都是共享內(nèi)存空間,去掉這個(gè)關(guān)鍵字,那么線(xiàn)程1和線(xiàn)程2鎖住的不是同一個(gè)對(duì)象了,問(wèn)題也不會(huì)產(chǎn)生。每個(gè)對(duì)象都包含了一把鎖(也叫作“監(jiān)視器”),它自動(dòng)成為對(duì)象的一部分(不必為此寫(xiě)任何特殊的代碼)。調(diào)用任何synchronized方法時(shí),對(duì)象就會(huì)被鎖定,不可再調(diào)用那個(gè)對(duì)象的其他任何synchronized方法,除非第一個(gè)方法完成了自己的工作,并解除鎖定。

          package com.example.thread2;


          public class TestDeadLock implements Runnable {
              
          public int flag = 1;
              
          static Object S1 = new Object();
              
          static Object S2 = new Object();
              
          public String threadId;
              
          public TestDeadLock(String s){
                  threadId 
          = s;
              }

              
          public void run() {
                  System.out.println(threadId 
          + ":flag=" + flag);
                  
          if (flag == 1) {
                      
          synchronized (S1) {
                          
          try {
                              Thread.sleep(
          500);
                          } 
          catch (Exception e) {
                              e.printStackTrace();
                          }
                          
          synchronized (S2) {
                              System.out.println(
          "1");
                          }
                      }
                  }
                  
          if (flag == 0) {
                      
          synchronized (S2) {
                          
          try {
                              Thread.sleep(
          500);
                          } 
          catch (Exception e) {
                              e.printStackTrace();
                          }
                          
          synchronized (S1) {
                              System.out.println(
          "0");
                          }
                      }
                  }
              }

              
          public static void main(String[] args) {
                  TestDeadLock td1 
          = new TestDeadLock("No.1");
                  TestDeadLock td2 
          = new TestDeadLock("No.2");
                  td1.flag 
          = 1;
                  td2.flag 
          = 0;
                  Thread t1 
          = new Thread(td1);
                  Thread t2 
          = new Thread(td2);
                  t1.start();
                  t2.start();
              }
          }
          posted on 2009-03-12 20:57 王總兵 閱讀(265) 評(píng)論(1)  編輯  收藏 所屬分類(lèi): Spring

          評(píng)論

          # re: 關(guān)于synchronized的一段代碼 2009-03-12 20:58 王兵
          個(gè)人認(rèn)為,隨著新的JDK發(fā)布,新的同步解決方案的提出,synchronized關(guān)鍵字會(huì)慢慢的淡出視線(xiàn)的。  回復(fù)  更多評(píng)論
            

          主站蜘蛛池模板: 长丰县| 石首市| 黔西| 若羌县| 河池市| 大化| 区。| 常德市| 秭归县| 荃湾区| 东安县| 太湖县| 富锦市| 津南区| 林周县| 富阳市| 枣强县| 平潭县| 遵义县| 海兴县| 宜丰县| 甘泉县| 永登县| 裕民县| 松江区| 红安县| 石棉县| 皋兰县| 威信县| 仪陇县| 叙永县| 红安县| 政和县| 阿巴嘎旗| 杭锦后旗| 聂拉木县| 越西县| 高州市| 政和县| 土默特左旗| 嘉荫县|