日韩无码专区无码一级三级片|91人人爱网站中日韩无码电影|厨房大战丰满熟妇|AV高清无码在线免费观看|另类AV日韩少妇熟女|中文日本大黄一级黄色片|色情在线视频免费|亚洲成人特黄a片|黄片wwwav色图欧美|欧亚乱色一区二区三区

RELATEED CONSULTING
相關(guān)咨詢
選擇下列產(chǎn)品馬上在線溝通
服務(wù)時(shí)間:8:30-17:00
你可能遇到了下面的問(wèn)題
關(guān)閉右側(cè)工具欄

新聞中心

這里有您想知道的互聯(lián)網(wǎng)營(yíng)銷(xiāo)解決方案
初學(xué)Java多線程:使用Synchronized塊同步方法

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

10年積累的成都網(wǎng)站建設(shè)、成都做網(wǎng)站經(jīng)驗(yàn),可以快速應(yīng)對(duì)客戶對(duì)網(wǎng)站的新想法和需求。提供各種問(wèn)題對(duì)應(yīng)的解決方案。讓選擇我們的客戶得到更好、更有力的網(wǎng)絡(luò)服務(wù)。我雖然不認(rèn)識(shí)你,你也不認(rèn)識(shí)我。但先建設(shè)網(wǎng)站后付款的網(wǎng)站建設(shè)流程,更有富陽(yáng)免費(fèi)網(wǎng)站建設(shè)讓你可以放心的選擇與我們合作。

synchronized塊的語(yǔ)法如下:

 
 
 
  1. public void method()  
  2. {  
  3.     … …  
  4.     synchronized(表達(dá)式)  
  5.     {  
  6.         … …  
  7.     }  

一、非靜態(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)方法

 
 
 
  1. public class SyncBlock  
  2.  {  
  3.       public void method1()  
  4.       {  
  5.           synchronized(this)  // 相當(dāng)于對(duì)method1方法使用synchronized關(guān)鍵字  
  6.           {  
  7.               … …  
  8.           }  
  9.       }  
  10.       public void method2()  
  11.       {  
  12.           synchronized(this)  // 相當(dāng)于對(duì)method2方法使用synchronized關(guān)鍵字  
  13.           {  
  14.               … …  
  15.           }  
  16.       }  
  17.       public synchronized void method3()    
  18.       {  
  19.           … …  
  20.       }  
  21.   } 

在上面的代碼中的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)方法同步

 
 
 
  1. public class SyncBlock  
  2. {  
  3.     … …  
  4.     class InnerClass  
  5.     {  
  6.         public void method4()  
  7.         {  
  8.             synchronized(SyncBlock.this)  
  9.             {  
  10.                 … …   
  11.             }  
  12.         }  
  13.     }  
  14.     … …  

在上面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)方法

 
 
 
  1. public class StaticSyncBlock  
  2.   {  
  3.       public static void method1()  
  4.       {  
  5.           synchronized(StaticSyncBlock.class)    
  6.           {  
  7.               … …  
  8.           }  
  9.       }  
  10.       public static synchronized void method2()    
  11.       {  
  12.           … …  
  13.       }  
  14.   } 

在同步靜態(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ì)象

 
 
 
  1. public class StaticSyncBlock  
  2. {  
  3.     public static StaticSyncBlock instance;   
  4.     public StaticSyncBlock()  
  5.     {  
  6.         instance = this;  
  7.     }  
  8.     public static void method1()  
  9.     {  
  10.        synchronized(instance.getClass())  
  11.        {  
  12.               
  13.        }  
  14.     }  
  15.        
  16. }  

在上面代碼中通過(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方法同步

 
 
 
  1. public class Test  
  2. {  
  3.     public static void method()  
  4.     {  
  5.         synchronized(StaticSyncBlock.class)  
  6.         {  
  7.                
  8.         }  
  9.     }  

注意:在使用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)注意。

【編輯推薦】

  1. 初學(xué)Java多線程:使用Synchronized關(guān)鍵字同步類方法
  2. 初學(xué)Java多線程:從線程返回?cái)?shù)據(jù)的兩種方法
  3. 初學(xué)Java多線程:向線程傳遞數(shù)據(jù)的三種方法
  4. 初學(xué)Java多線程:慎重使用volatile關(guān)鍵字
  5. 初學(xué)Java多線程:join方法的使用

文章名稱:初學(xué)Java多線程:使用Synchronized塊同步方法
轉(zhuǎn)載來(lái)于:http://m.5511xx.com/article/djjosjg.html