瘋狂

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

          synchronized 要注意的地方

          Posted on 2011-10-17 10:56 瘋狂 閱讀(1796) 評論(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中將被鎖住

          主站蜘蛛池模板: 甘泉县| 镇平县| 六盘水市| 香河县| 玛曲县| 蕉岭县| 定襄县| 阿坝县| 临高县| 平远县| 腾冲县| 岳普湖县| 卓尼县| 个旧市| 当雄县| 赫章县| 泰安市| 汝阳县| 宁海县| 灌云县| 阳城县| 西畴县| 西峡县| 峨山| 年辖:市辖区| 平泉县| 揭阳市| 克什克腾旗| 福海县| 高青县| 兴海县| 梨树县| 化州市| 民乐县| 阿荣旗| 舒兰市| 泉州市| 和平县| 海口市| 阳东县| 大渡口区|