瘋狂

          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中將被鎖住

          主站蜘蛛池模板: 白城市| 白沙| 五大连池市| 抚顺市| 原平市| 八宿县| 措勤县| 泸州市| 青铜峡市| 青河县| 莱阳市| 广西| 鱼台县| 观塘区| 来凤县| 泽普县| 寻乌县| 万安县| 浠水县| 观塘区| 读书| 姜堰市| 淄博市| 夏邑县| 江口县| 郁南县| 遂宁市| 昌乐县| 平和县| 柏乡县| 沙河市| 巴塘县| 商河县| 大港区| 施甸县| 昆山市| 合作市| 太和县| 定安县| 手游| 汝阳县|