一个实例中,多个synchronized方法的调用

更通俗简单的问法: "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

猜你喜欢

转载自blog.csdn.net/hd243608836/article/details/80210266
今日推荐