一区二区三区在线-一区二区三区亚洲视频-一区二区三区亚洲-一区二区三区午夜-一区二区三区四区在线视频-一区二区三区四区在线免费观看

服務器之家:專注于服務器技術及軟件下載分享
分類導航

PHP教程|ASP.NET教程|JAVA教程|ASP教程|

服務器之家 - 編程語言 - JAVA教程 - java多線程編程之使用Synchronized塊同步方法

java多線程編程之使用Synchronized塊同步方法

2019-11-04 14:10java技術網 JAVA教程

synchronized塊來同步一個對象變量,也可以使用synchronized塊來同步類中的靜態方法和非靜態方法,下面使用Synchronized塊同步方法

synchronized關鍵字有兩種用法。第一種就是在《使用Synchronized關鍵字同步類方法》一文中所介紹的直接用在方法的定義中。另外一種就是synchronized塊。我們不僅可以通過synchronized塊來同步一個對象變量。也可以使用synchronized塊來同步類中的靜態方法和非靜態方法。
synchronized塊的語法如下:

 

復制代碼代碼如下:

public void method()
{
    … …
    synchronized(表達式)
    {
        … …
    }
}

 

一、非靜態類方法的同步 

從《使用Synchronized關鍵字同步類方法》一文中我們知道使用synchronized關鍵字來定義方法就會鎖定類中所有使用synchronzied關鍵字定義的靜態方法或非靜態方法,但這并不好理解。而如果使用synchronized塊來達到同樣的效果,就不難理解為什么會產生這種效果了。如果想使用synchronized塊來鎖定類中所有的同步非靜態方法,需要使用this做為synchronized塊的參數傳入synchronized塊國,代碼如下:
通過synchronized塊同步非靜態方法

 

復制代碼代碼如下:

public class SyncBlock
   {
       public void method1()
       {
           synchronized(this)  // 相當于對method1方法使用synchronized關鍵字
           {
               … …
           }
       }
       public void method2()
       {
           synchronized(this)  // 相當于對method2方法使用synchronized關鍵字
           {
               … …
           }
       }
       public synchronized void method3()  
       {
           … …
       }
   }

 

在上面的代碼中的method1和method2方法中使用了synchronized塊。而第017行的method3方法仍然使用synchronized關鍵字來定義方法。在使用同一個SyncBlock類實例時,這三個方法只要有一個正在執行,其他兩個方法就會因未獲得同步鎖而被阻塞。在使用synchronized塊時要想達到和synchronized關鍵字同樣的效果,必須將所有的代碼都寫在synchronized塊中,否則,將無法使當前方法中的所有代碼和其他的方法同步。
除了使用this做為synchronized塊的參數外,還可以使用SyncBlock.this作為synchronized塊的參數來達到同樣的效果。
在內類(InnerClass)的方法中使用synchronized塊來時,this只表示內類,和外類(OuterClass)沒有關系。但內類的非靜態方法可以和外類的非靜態方法同步。如在內類InnerClass中加一個method4方法,并使method4方法和SyncBlock的三個方法同步,代碼如下:
使內類的非靜態方法和外類的非靜態方法同步 

復制代碼代碼如下:

public class SyncBlock
{
    … …
    class InnerClass
    {
        public void method4()
        {
            synchronized(SyncBlock.this)
            {
                … … 
            }
        }
    }
    … …
}

 

在上面SyncBlock類的新版本中,InnerClass類的method4方法和SyncBlock類的其他三個方法同步,因此,method1、method2、method3和method4四個方法在同一時間只能有一個方法執行。
Synchronized塊不管是正常執行完,還是因為程序出錯而異常退出synchronized塊,當前的synchronized塊所持有的同步鎖都會自動釋放。因此,在使用synchronized塊時不必擔心同步鎖的釋放問題。

二、靜態類方法的同步
由于在調用靜態方法時,對象實例不一定被創建。因此,就不能使用this來同步靜態方法,而必須使用Class對象來同步靜態方法。代碼如下:
通過synchronized塊同步靜態方法 

復制代碼代碼如下:

public class StaticSyncBlock
{
       public static void method1()
       {
           synchronized(StaticSyncBlock.class)  
           {
               … …
           }
       }
       public static synchronized void method2()  
       {
           … …
       }
   }


在同步靜態方法時可以使用類的靜態字段class來得到Class對象。在上例中method1和method2方法同時只能有一個方法執行。除了使用class字段得到Class對象外,還可以使用實例的getClass方法來得到Class對象。上例中的代碼可以修改如下:
使用getClass方法得到Class對象

 

 

復制代碼代碼如下:

public class StaticSyncBlock
{
    public static StaticSyncBlock instance; 
    public StaticSyncBlock()
    {
        instance = this;
    }
    public static void method1()
    {
       synchronized(instance.getClass())
       {

       }
    }   
}

 

在上面代碼中通過一個public的靜態instance得到一個StaticSyncBlock類的實例,并通過這個實例的getClass方法得到了Class對象(一個類的所有實例通過getClass方法得到的都是同一個Class對象,因此,調用任何一個實例的getClass方法都可以)。我們還可以通過Class對象使不同類的靜態方法同步,如Test類的靜態方法method和StaticSyncBlock類的兩個靜態方法同步,代碼如下:
Test類的method方法和StaticSyncBlock類的method1、method2方法同步

復制代碼代碼如下:

public class Test
   {
       public static void method()
       {
           synchronized(StaticSyncBlock.class)
           {

           }
       }
   }

 

注意:在使用synchronized塊同步類方法時,非靜態方法可以使用this來同步,而靜態方法必須使用Class對象來同步。它們互不影響。當然,也可以在非靜態方法中使用Class對象來同步靜態方法。但在靜態方法中不能使用this來同步非靜態方法。這一點在使用synchronized塊同步類方法時應注意。

延伸 · 閱讀

精彩推薦
主站蜘蛛池模板: 九九九九在线视频播放 | 欧美午夜视频一区二区三区 | 精品日韩欧美一区二区三区在线播放 | 免费看男人使劲躁女人小说 | 麻生希在线 | 无人影院在线播放视频 | 色综合天天综合网国产人 | 啊哈~嗯哼~用力cao我小说 | 久久re亚洲在线视频 | 色综合国产 | 亚洲成人免费 | 高清国产精品久久 | 动漫xnxx| 亚洲天天综合 | 国产二区三区 | 成年人视频在线 | 动漫女性扒开尿口羞羞漫画 | 亚洲高清中文字幕 | 青青在线 | 视频一区二区三区在线 | 精灵之森高清在线 | ass日本乱妇ass | 亚洲第一色视频 | 女主被男主为催奶药h | 向日葵视频app下载18岁以下勿看 | 2019nv天堂香蕉在线观看 | 亚洲国产天堂综合一区 | 青青青国产在线观看 | 欧美精品三区 | 精品久久久久免费极品大片 | 亚洲国产视频一区 | 日韩精品视频美在线精品视频 | free性欧洲| 国产精品美女久久久久 | 草莓香蕉绿巨人丝瓜榴莲污在线观看 | 好吊色青青青国产综合在线观看 | 欧美乱码视频 | 青青青视频免费线看 视频 青青青青青国产免费手机看视频 | 99热成人精品免费久久 | 亚洲国产情侣一区二区三区 | 国产高清国内精品福利 |