成人免费xxxxx在线视频软件_久久精品久久久_亚洲国产精品久久久_天天色天天色_亚洲人成一区_欧美一级欧美三级在线观看

初學Java多線程:使用Synchronized塊同步方法

開發 后端
在使用Java多線程中會需要使用Synchronized塊同步方法。我們不僅可以通過synchronized塊來同步一個對象變量。也可以使用synchronized塊來同步類中的靜態方法和非靜態方法。

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

synchronized塊的語法如下:

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

一、非靜態類方法的同步   

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

通過synchronized塊同步非靜態方法

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

在上面的代碼中的method1和method2方法中使用了synchronized塊。而第017行的method3方法仍然使用synchronized關鍵字來定義方法。在使用同一個SyncBlock類實例時,這三個方法只要有一個正在執行,其他兩個方法就會因未獲得同步鎖而被阻塞。在使用synchronized塊時要想達到和synchronized關鍵字同樣的效果,必須將所有的代碼都寫在synchronized塊中,否則,將無法使當前方法中的所有代碼和其他的方法同步。

除了使用this做為synchronized塊的參數外,還可以使用SyncBlock.this作為synchronized塊的參數來達到同樣的效果。

在內類(InnerClass)的方法中使用synchronized塊來時,this只表示內類,和外類(OuterClass)沒有關系。但內類的非靜態方法可以和外類的非靜態方法同步。如在內類InnerClass中加一個method4方法,并使method4方法和SyncBlock的三個方法同步,代碼如下:

使內類的非靜態方法和外類的非靜態方法同步

  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類的其他三個方法同步,因此,method1、method2、method3和method4四個方法在同一時間只能有一個方法執行。

Synchronized塊不管是正常執行完,還是因為程序出錯而異常退出synchronized塊,當前的synchronized塊所持有的同步鎖都會自動釋放。因此,在使用synchronized塊時不必擔心同步鎖的釋放問題。

二、靜態類方法的同步

由于在調用靜態方法時,對象實例不一定被創建。因此,就不能使用this來同步靜態方法,而必須使用Class對象來同步靜態方法。代碼如下:

通過synchronized塊同步靜態方法

  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.   } 

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

使用getClass方法得到Class對象

  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. }  

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

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塊同步類方法時,非靜態方法可以使用this來同步,而靜態方法必須使用Class對象來同步。它們互不影響。當然,也可以在非靜態方法中使用Class對象來同步靜態方法。但在靜態方法中不能使用this來同步非靜態方法。這一點在使用synchronized塊同步類方法時應注意。

【編輯推薦】

  1. 初學Java多線程:使用Synchronized關鍵字同步類方法
  2. 初學Java多線程:從線程返回數據的兩種方法
  3. 初學Java多線程:向線程傳遞數據的三種方法
  4. 初學Java多線程:慎重使用volatile關鍵字
  5. 初學Java多線程:join方法的使用
責任編輯:yangsai 來源: 真的有外星人嗎
相關推薦

2009-06-29 18:44:28

Java多線程Synchronize同步變量

2009-06-29 18:26:11

Java多線程Synchronize同步類

2011-04-14 13:27:53

Synchronize多線程

2009-06-29 18:08:51

Java多線程join方法

2009-06-29 18:00:05

Java多線程Runnable接口創建線程

2009-06-29 17:49:47

Java多線程

2015-09-10 09:30:54

Java多線程同步

2009-06-29 18:14:23

Java多線程volatile關鍵字

2009-06-29 17:54:10

Java多線程Thread類創建線程

2009-06-29 18:03:15

Java多線程線程的生命周期

2009-06-29 18:22:54

Java多線程從線程返回數據

2009-06-29 18:18:53

Java多線程向線程傳遞數據

2017-05-27 20:59:30

Java多線程synchronize

2010-01-21 11:27:30

linux多線程機制線程同步

2010-03-15 19:37:00

Java多線程同步

2023-12-08 18:01:25

Java關鍵字

2009-08-12 13:37:01

Java synchr

2022-07-07 00:33:34

Java線程同步

2015-07-22 09:39:38

IOS多線程同步

2024-11-27 15:58:49

點贊
收藏

51CTO技術棧公眾號

主站蜘蛛池模板: 日韩欧美在线一区 | 国产黄色精品 | 国产高清视频在线观看播放 | 91网在线播放 | 国产一区二区日韩 | 亚洲国产精品人人爽夜夜爽 | 欧美一级免费看 | 伊人网国产 | 国产精品亚洲成在人线 | 欧美成人aaa级毛片在线视频 | 国产蜜臀97一区二区三区 | 视频一区 国产精品 | 国产精品久久久久久久久久免费看 | 激情三区 | 日本精品一区二区 | 国产99视频精品免费播放照片 | 91精品国产91久久综合桃花 | 一级女毛片| 黄视频免费在线 | www.日本在线 | av在线成人 | 日韩视频免费看 | 免费视频久久久久 | 欧美成视频在线观看 | 欧美一级黄色片免费观看 | 精品国产精品国产偷麻豆 | 亚洲成人免费av | 日本小电影网站 | 一级a爱片久久毛片 | 91综合网 | 免费亚洲网站 | 日韩电影免费观看中文字幕 | 亚洲成人精品一区 | 免费在线一区二区三区 | 韩日一区二区 | 一区二区三区视频在线免费观看 | 成人免费视频在线观看 | 久久国产一区二区三区 | 国产欧美精品一区二区三区 | 中文在线a在线 | www.三级 |