沉睡森林@漂在北京

          本處文章除注明“轉載”外均為原創,轉載請注明出處。

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

          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 王總兵 閱讀(274) 評論(1)  編輯  收藏 所屬分類: Spring

          評論

          # re: 關于synchronized的一段代碼 2009-03-12 20:58 王兵
          個人認為,隨著新的JDK發布,新的同步解決方案的提出,synchronized關鍵字會慢慢的淡出視線的。  回復  更多評論
            

          主站蜘蛛池模板: 西贡区| 天等县| 东莞市| 定南县| 微山县| 三都| 梁河县| 赣州市| 抚顺市| 周至县| 凌海市| 通许县| 灵川县| 炉霍县| 建始县| 安仁县| 柘城县| 南平市| 繁昌县| 沂南县| 闻喜县| 图木舒克市| 乐安县| 兴和县| 防城港市| 滕州市| 福海县| 利川市| 博客| 获嘉县| 丹凤县| 闵行区| 永昌县| 克山县| 龙川县| 同德县| 兴和县| 永吉县| 启东市| 通州市| 龙井市|