最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

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

 更新時間:2014年01月23日 15:20:52   作者:  
synchronized塊來同步一個對象變量,也可以使用synchronized塊來同步類中的靜態(tài)方法和非靜態(tài)方法,下面使用Synchronized塊同步方法

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

       }
    }  
}

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

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

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

           }
       }
   }

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

相關(guān)文章

  • SpringSecurity中的Filter Chain(過濾器鏈)

    SpringSecurity中的Filter Chain(過濾器鏈)

    Spring Security的Filter Chain是由一系列過濾器組成的管道,每個過濾器執(zhí)行特定的安全功能,Spring Security能夠提供強大而靈活的安全控制機制,從而保護你的應(yīng)用程序不受各種網(wǎng)絡(luò)安全威脅的侵害,本文介紹SpringSecurity中的Filter Chain,感興趣的朋友跟隨小編一起看看吧
    2024-06-06
  • Java超詳細講解排序二叉樹

    Java超詳細講解排序二叉樹

    排序二叉樹的特點是一個父節(jié)點只能有左右兩個子節(jié)點、左節(jié)點的值比父節(jié)點要小、右節(jié)點的值要比父節(jié)點要大,難度并不大,但是得花時間來理解
    2022-06-06
  • Java中的synchronized鎖膨脹詳解

    Java中的synchronized鎖膨脹詳解

    這篇文章主要介紹了Java中的synchronized鎖膨脹詳解,正常創(chuàng)建的對象,狀態(tài)為無鎖,對象頭的Mark?Word?中主要記錄了?對象的年齡,也就是經(jīng)歷了多少次GC還存活下來,需要的朋友可以參考下
    2024-01-01
  • Java內(nèi)存溢出場景及解決方案

    Java內(nèi)存溢出場景及解決方案

    內(nèi)存溢出是Java應(yīng)用開發(fā)中常見的問題,但通過合理的代碼優(yōu)化、內(nèi)存管理以及JVM參數(shù)調(diào)整,我們可以有效地避免和解決這類問題,這篇文章主要介紹了Java內(nèi)存溢出場景及解決辦法,需要的朋友可以參考下
    2024-04-04
  • Java 找不到或無法加載主類的修復(fù)方法

    Java 找不到或無法加載主類的修復(fù)方法

    這篇文章主要介紹了Java 找不到或無法加載主類的修復(fù)方法,幫助大家更好的理解和使用Java,感興趣的朋友可以了解下
    2021-02-02
  • JAVA二叉樹的基本操作

    JAVA二叉樹的基本操作

    這篇文章主要介紹了JAVA二叉樹的基本操作DEMO,想要詳情了解的小伙伴請接著看下文吧
    2021-08-08
  • Java 數(shù)據(jù)結(jié)構(gòu)與算法系列精講之哈希算法實現(xiàn)

    Java 數(shù)據(jù)結(jié)構(gòu)與算法系列精講之哈希算法實現(xiàn)

    哈希表本質(zhì)是一種(key,value)結(jié)構(gòu),由此我們可以聯(lián)想到,能不能把哈希表的key映射成數(shù)組的索引index呢?如果這樣做的話那么查詢相當(dāng)于直接查詢索引,查詢時間復(fù)雜度為O(1),其實這也正是當(dāng)key為int型時的做法,將key通過某種做法映射成index,從而轉(zhuǎn)換成數(shù)組結(jié)構(gòu)
    2022-02-02
  • Java處理時間格式CST和GMT轉(zhuǎn)換方法示例

    Java處理時間格式CST和GMT轉(zhuǎn)換方法示例

    這篇文章主要給大家介紹了關(guān)于Java處理時間格式CST和GMT轉(zhuǎn)換方法的相關(guān)資料,相信很多小伙伴在時間格式轉(zhuǎn)換的時候非常頭疼,文中通過代碼示例介紹的非常詳細,需要的朋友可以參考下
    2023-09-09
  • Java基礎(chǔ)之打印萬年歷的簡單實現(xiàn)(案例)

    Java基礎(chǔ)之打印萬年歷的簡單實現(xiàn)(案例)

    下面小編就為大家?guī)硪黄狫ava基礎(chǔ)之打印萬年歷的簡單實現(xiàn)(案例)。小編覺得挺不錯的,現(xiàn)在就分享給大家,也給大家做個參考。一起跟隨小編過來看看吧
    2016-07-07
  • 最新SpringCloud?Stream消息驅(qū)動講解

    最新SpringCloud?Stream消息驅(qū)動講解

    SpringCloud Stream 是一個構(gòu)建消息驅(qū)動微服務(wù)的框架,通過 SpringCloud Stream 連接消息中間件,以實現(xiàn)消息事件驅(qū)動,這篇文章主要介紹了SpringCloud?Stream消息驅(qū)動,需要的朋友可以參考下
    2022-11-11

最新評論

阳谷县| 廊坊市| 诸城市| 田东县| 许昌县| 南安市| 诏安县| 奉贤区| 宁河县| 庆元县| 永吉县| 本溪| 山阳县| 麦盖提县| 石楼县| 黄平县| 云龙县| 崇州市| 霍邱县| 同心县| 仁寿县| 开原市| 湛江市| 武宣县| 永年县| 江门市| 马边| 新干县| 甘洛县| 运城市| 株洲县| 张家川| 东台市| 武穴市| 于都县| 龙陵县| 泰兴市| 凌云县| 新和县| 历史| 五大连池市|