一個例項中,多個synchronized方法的呼叫

HD243608836發表於2018-05-05

更通俗簡單的問法: "Java中兩個執行緒是否可以同時訪問一個物件的兩個不同的synchronized方法????"

答案是: 不可以!!!


[java] view plain copy
  1. public class ThreadA extends Thread {  
  2.     private MyObject object;  
  3.   
  4.     public ThreadA(MyObject object){  
  5.         this.object = object;  
  6.     }  
  7.   
  8.     public void run(){  
  9.         super.run();  
  10.         object.menthodA();  
  11.     }  
  12. }  


[java] view plain copy
  1. public class ThreadB extends Thread {  
  2.     private MyObject object;  
  3.   
  4.     public ThreadB(MyObject object){  
  5.         this.object = object;  
  6.     }  
  7.   
  8.     public void run(){  
  9.         super.run();  
  10.         object.methodB();  
  11.     }  
  12. }  

[java] view plain copy
  1. public class Run {  
  2.     public static void main(String args[]){  
  3.         MyObject myObject = new MyObject();  
  4.         ThreadA threadA = new ThreadA(myObject);  
  5.         threadA.setName("A");  
  6.         threadA.start();  
  7.         ThreadB threadB = new ThreadB(myObject);  
  8.         threadB.setName("B");  
  9.         threadB.start();  
  10.     }  
  11. }  

程式碼如上所示,MyObject類有兩個方法,分別建立兩個執行緒呼叫方法A和方法B:

1、方法A和方法B都沒有加synchronized關鍵字時,呼叫方法A的時候可進入方法B;

2、方法A加synchronized關鍵字而方法B沒有加時,呼叫方法A的時候可以進入方法B;

3、方法A和方法B都加了synchronized關鍵字時,呼叫方法A之後,必須等A執行完成才能進入方法B;

4、方法A和方法B都加了synchronized關鍵字時,且方法A加了wait()方法時,呼叫方法A的時候可以進入方法B;

5、方法A加了synchronized關鍵字,而方法B為static靜態方法時,呼叫方法A的時候可進入方法B;

6、方法A和方法B都是static靜態方法,且都加了synchronized關鍵字,則呼叫方法A之後,需要等A執行完成才能進入方法B;

7、方法A和方法B都是static靜態方法,且都加了synchronized關鍵字,建立不同的執行緒分別呼叫A和B,需要等A執行完成才能執行B(因為static方法是單例項的,A持有的是Class鎖,Class鎖可以對類的所有物件例項起作用)

總結:

同一個object中多個方法都加了synchronized關鍵字的時候,其中呼叫任意方法之後需等該方法執行完成才能呼叫其他方法,即同步的,阻塞的

此結論同樣適用於對於object中使用synchronized(this)同步程式碼塊的場景;

synchronized鎖定的都是當前物件!


轉載自:https://blog.csdn.net/aiyawalie/article/details/53261823

相關文章