- public class ThreadA extends Thread {
- private MyObject object;
- public ThreadA(MyObject object){
- this.object = object;
- }
- public void run(){
- super.run();
- object.menthodA();
- }
- }
- public class ThreadB extends Thread {
- private MyObject object;
- public ThreadB(MyObject object){
- this.object = object;
- }
- public void run(){
- super.run();
- object.methodB();
- }
- }
- public class Run {
- public static void main(String args[]){
- MyObject myObject = new MyObject();
- ThreadA threadA = new ThreadA(myObject);
- threadA.setName("A");
- threadA.start();
- ThreadB threadB = new ThreadB(myObject);
- threadB.setName("B");
- threadB.start();
- }
- }
代码如上所示,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