亚洲免费在线-亚洲免费在线播放-亚洲免费在线观看-亚洲免费在线观看视频-亚洲免费在线看-亚洲免费在线视频

使用Synchronized塊同步方法

系統 1712 0

轉載: http://java.chinaitlab.com/line/779789_2.html

?

?

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

??? synchronized塊的語法如下:

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

??? 一、非靜態類方法的同步

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

??? 通過synchronized塊同步非靜態方法

?? 001 ?? public ? class ?SyncBlock
??
002 ??{
??
003 ?????? public ? void ?method1()
??
004 ??????{
??
005 ?????????? synchronized ( this )?? // ?相當于對method1方法使用synchronized關鍵字
?? 006 ??????????{
??
007 ??????????????…?…
??
008 ??????????}
??
009 ??????}
??
010 ?????? public ? void ?method2()
??
011 ??????{
??
012 ?????????? synchronized ( this )?? // ?相當于對method2方法使用synchronized關鍵字
?? 013 ??????????{
??
014 ??????????????…?…
??
015 ??????????}
??
016 ??????}
??
017 ?????? public ? synchronized ? void ?method3()??
??
018 ??????{
??
019 ??????????…?…
??
020 ??????}
??
021 ??}

??? 在上面的代碼中的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塊同步類方法時應注意。

使用Synchronized塊同步方法


更多文章、技術交流、商務合作、聯系博主

微信掃碼或搜索:z360901061

微信掃一掃加我為好友

QQ號聯系: 360901061

您的支持是博主寫作最大的動力,如果您喜歡我的文章,感覺我的文章對您有幫助,請用微信掃描下面二維碼支持博主2元、5元、10元、20元等您想捐的金額吧,狠狠點擊下面給點支持吧,站長非常感激您!手機微信長按不能支付解決辦法:請將微信支付二維碼保存到相冊,切換到微信,然后點擊微信右上角掃一掃功能,選擇支付二維碼完成支付。

【本文對您有幫助就好】

您的支持是博主寫作最大的動力,如果您喜歡我的文章,感覺我的文章對您有幫助,請用微信掃描上面二維碼支持博主2元、5元、10元、自定義金額等您想捐的金額吧,站長會非常 感謝您的哦!!!

發表我的評論
最新評論 總共0條評論
主站蜘蛛池模板: 亚洲视频一 | 亚洲精品久久久久久婷婷 | 亚洲综合日韩中文字幕v在线 | 日韩精品福利视频一区二区三区 | 亚洲精品 国产 日韩 | 蜜桃久久久 | aaa一级最新毛片 | 欧美成人久久久免费播放 | 欧美无吗 | 一级午夜a毛片免费视频 | 欧美一级毛片欧美毛片视频 | 亚洲欧美高清在线 | 四虎影院一级片 | 久久久久久亚洲精品影院 | 久久视频精品a线视频在线观看 | 色色色在线 | 久久精品青草社区 | 精品久久免费观看 | 久久羞羞视频 | 国内精品一区视频在线播放 | 丁香婷婷六月 | 四虎影视在线影院4hu | 久久夜色撩人精品国产 | 久久99网站| 四虎影视免费永久在线观看 | 国产一区二区免费 | 国产成人精品s8sp视频 | 久久精品免观看国产成人 | 久久精品国产一区二区三区不卡 | 国产一区二区不卡免费观在线 | 精品久久久在线观看 | 2022国产男人亚洲欧美天堂 | 伦理久久 | 日本在线观看www鲁啊鲁视频 | 精品色 | 久久久久国产精品四虎 | 性生活视频免费观看 | 狠狠色噜噜狠狠狠狠97老肥女 | 色 综合 欧美 亚洲 国产 | 97影院在线午夜 | 性欧美暴力猛交xxxxx高清 |