激情久久久_欧美视频区_成人av免费_不卡视频一二三区_欧美精品在欧美一区二区少妇_欧美一区二区三区的

服務(wù)器之家:專注于服務(wù)器技術(shù)及軟件下載分享
分類導(dǎo)航

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

服務(wù)器之家 - 編程語(yǔ)言 - JAVA教程 - java多線程編程之使用Synchronized塊同步方法

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

2019-11-04 14:10java技術(shù)網(wǎng) JAVA教程

synchronized塊來(lái)同步一個(gè)對(duì)象變量,也可以使用synchronized塊來(lái)同步類中的靜態(tài)方法和非靜態(tài)方法,下面使用Synchronized塊同步方法

synchronized關(guān)鍵字有兩種用法。第一種就是在《使用Synchronized關(guān)鍵字同步類方法》一文中所介紹的直接用在方法的定義中。另外一種就是synchronized塊。我們不僅可以通過(guò)synchronized塊來(lái)同步一個(gè)對(duì)象變量。也可以使用synchronized塊來(lái)同步類中的靜態(tài)方法和非靜態(tài)方法。
synchronized塊的語(yǔ)法如下:

 

復(fù)制代碼代碼如下:

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

 

一、非靜態(tài)類方法的同步 

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

 

復(fù)制代碼代碼如下:

public class SyncBlock
   {
       public void method1()
       {
           synchronized(this)  // 相當(dāng)于對(duì)method1方法使用synchronized關(guān)鍵字
           {
               … …
           }
       }
       public void method2()
       {
           synchronized(this)  // 相當(dāng)于對(duì)method2方法使用synchronized關(guān)鍵字
           {
               … …
           }
       }
       public synchronized void method3()  
       {
           … …
       }
   }

 

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

復(fù)制代碼代碼如下:

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

 

在上面SyncBlock類的新版本中,InnerClass類的method4方法和SyncBlock類的其他三個(gè)方法同步,因此,method1、method2、method3和method4四個(gè)方法在同一時(shí)間只能有一個(gè)方法執(zhí)行。
Synchronized塊不管是正常執(zhí)行完,還是因?yàn)槌绦虺鲥e(cuò)而異常退出synchronized塊,當(dāng)前的synchronized塊所持有的同步鎖都會(huì)自動(dòng)釋放。因此,在使用synchronized塊時(shí)不必?fù)?dān)心同步鎖的釋放問(wèn)題。

二、靜態(tài)類方法的同步
由于在調(diào)用靜態(tài)方法時(shí),對(duì)象實(shí)例不一定被創(chuàng)建。因此,就不能使用this來(lái)同步靜態(tài)方法,而必須使用Class對(duì)象來(lái)同步靜態(tài)方法。代碼如下:
通過(guò)synchronized塊同步靜態(tài)方法 

復(fù)制代碼代碼如下:

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


在同步靜態(tài)方法時(shí)可以使用類的靜態(tài)字段class來(lái)得到Class對(duì)象。在上例中method1和method2方法同時(shí)只能有一個(gè)方法執(zhí)行。除了使用class字段得到Class對(duì)象外,還可以使用實(shí)例的getClass方法來(lái)得到Class對(duì)象。上例中的代碼可以修改如下:
使用getClass方法得到Class對(duì)象

 

 

復(fù)制代碼代碼如下:

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

       }
    }   
}

 

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

復(fù)制代碼代碼如下:

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

           }
       }
   }

 

注意:在使用synchronized塊同步類方法時(shí),非靜態(tài)方法可以使用this來(lái)同步,而靜態(tài)方法必須使用Class對(duì)象來(lái)同步。它們互不影響。當(dāng)然,也可以在非靜態(tài)方法中使用Class對(duì)象來(lái)同步靜態(tài)方法。但在靜態(tài)方法中不能使用this來(lái)同步非靜態(tài)方法。這一點(diǎn)在使用synchronized塊同步類方法時(shí)應(yīng)注意。

延伸 · 閱讀

精彩推薦
主站蜘蛛池模板: 操操操操操| 久久6国产 | 99视频观看| 青青草成人自拍 | 国产91porn| 毛片免费视频网站 | 欧美日韩免费在线观看视频 | av在线官网| 成品片a免人视频 | 国产一级毛片不卡 | 欧洲a级片 | 免费毛片观看 | 亚洲第一成人在线观看 | 色综合久久久久久久久久 | 美女扒开胸罩给男生看视频 | 91情侣在线偷精品国产 | 精品一区二区电影 | www成人在线观看 | 黄片毛片一级 | 99视频有精品视频高清 | 中日韩乱码一二新区 | 91精品最新国内在线播放 | 国产精品久久久久久婷婷天堂 | 色婷婷久久一区二区 | 日本免费中文字幕 | 欧美一级一级 | 1314av| 国产精品久久国产精麻豆96堂 | 欧美性受ⅹ╳╳╳黑人a性爽 | 一级电影免费 | 天天都色视频 | 精品一区二区三区在线播放 | 一区二区视频在线看 | 爱福利视频网 | 成人偷拍片视频在线观看 | 13一14毛片免费看 | 免费亚洲视频在线观看 | 日本一区二区久久久 | 久久久一区二区精品 | 激情亚洲一区二区三区 | 久久99精品久久久久久小说 |