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

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

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

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

復制代碼 代碼如下:

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

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

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

復制代碼 代碼如下:

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

復制代碼 代碼如下:

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

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

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

復制代碼 代碼如下:

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對象

復制代碼 代碼如下:

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對象,因此,調用任何一個實例的getClass方法都可以)。我們還可以通過Class對象使不同類的靜態(tài)方法同步,如Test類的靜態(tài)方法method和StaticSyncBlock類的兩個靜態(tài)方法同步,代碼如下:
Test類的method方法和StaticSyncBlock類的method1、method2方法同步

復制代碼 代碼如下:

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

           }
       }
   }

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

相關文章

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

    SpringSecurity中的Filter Chain(過濾器鏈)

    Spring Security的Filter Chain是由一系列過濾器組成的管道,每個過濾器執(zhí)行特定的安全功能,Spring Security能夠提供強大而靈活的安全控制機制,從而保護你的應用程序不受各種網(wǎng)絡安全威脅的侵害,本文介紹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內存溢出場景及解決方案

    Java內存溢出場景及解決方案

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

    Java 找不到或無法加載主類的修復方法

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

    JAVA二叉樹的基本操作

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

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

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

    Java處理時間格式CST和GMT轉換方法示例

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

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

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

    最新SpringCloud?Stream消息驅動講解

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

最新評論

合肥市| 新密市| 馆陶县| 麻江县| 乐平市| 宽甸| 剑河县| 峨边| 小金县| 东丰县| 兖州市| 普兰店市| 永川市| 乐昌市| 沛县| 洮南市| 彭州市| 元朗区| 洪洞县| 东乌珠穆沁旗| 乐东| 沙河市| 南部县| 察雅县| 剑河县| 龙岩市| 正蓝旗| 宜兰县| 锦屏县| 扶余县| 马龙县| 辽中县| 华坪县| 新河县| 岚皋县| 阳江市| 宿松县| 疏附县| 长葛市| 乌拉特中旗| 婺源县|