瘋狂

          STANDING ON THE SHOULDERS OF GIANTS
          posts - 481, comments - 486, trackbacks - 0, articles - 1
            BlogJava :: 首頁 :: 新隨筆 :: 聯系 :: 聚合  :: 管理

          synchronized 要注意的地方

          Posted on 2011-10-17 10:56 瘋狂 閱讀(1799) 評論(0)  編輯  收藏 所屬分類: java 、concurrent

          在Java1.5之前,synchronized應該是最常用的java支持并發手段。那synchronized是怎么做到的了,從java1.0開始,java中的每個對象就一個內部鎖。如果一個類的方法被synchronized關鍵字所修飾,那么這個對象的鎖將保護整個方法。

          舉例來說:

          public synchronized void method(){

              method body

          }

          等價于

          public void method(){

              this.intrinsicLock.lock();

              try{

                  method body;

              }finally(){

                  this.intrinsicLock.unlock();

              }

          }

           

          從上面的代碼示例可以看出,synchronized的使用方式是比較簡單的。這也導致了大量的初學者在碰到java編程的時候落入陷阱里,認為既然synhronized可以搞定一切,那么不管三七二十一,只要有并發可能性的地方,就加上synchronized的關鍵字,這顯然是不對的。在java對象中,這個java對象只有這一個內部鎖,其中一個synchronized方法獲取到了這個鎖,另外一個synchronized方法的調用將被阻塞。

          class sync{

              public synchronized void methodA(){};

              public synchronized void methodB(){};

              ... ...

           

          }

          methodA 和methodB在初始就是互斥的,如果methodA和methodB進入互相等待,就很容易出現死鎖的情況。那如果碰到這種情況,應該怎么做了?常用的方式是在方法內部新建一個無意義的對象,然后對這個無意義的對象加鍋。

           

          1. package zl.study.concurrency.synchronize;  
          2. public class Sync {  
          3.     private int i;  
          4.       
          5.     public void plus(){  
          6.         Object dummy = new Object();  
          7.         synchronized(dummy){  
          8.             i++;  
          9.         }  
          10.     }  
          11.       
          12.     public void minus(){  
          13.         Object dummy = new Object();  
          14.         synchronized(dummy){  
          15.             i--;  
          16.         }         
          17.     }  
          18. }  
           

          另外需要注意的是將靜態類聲明為synchronized方法也是合法的。舉例來說,如果Sync有一個static synchronized方法,那么這個方法被調用時,bank.class這個類對象本身在jvm中將被鎖住

          主站蜘蛛池模板: 巴青县| 武安市| 满城县| 白河县| 赣榆县| 易门县| 南陵县| 新民市| 视频| 无棣县| 洛扎县| 兴隆县| 新乡市| 安康市| 延庆县| 甘南县| 诸暨市| 上饶市| 茂名市| 台中县| 互助| 且末县| 景宁| 方山县| 公主岭市| 横峰县| 盖州市| 琼中| 蓝山县| 来宾市| 达孜县| 抚顺县| 利川市| 江西省| 巍山| 黄大仙区| 达日县| 永嘉县| 龙陵县| 江安县| 陵水|