Synchronized修饰方法A和B,这两个方法是互斥的吗?

Synchronized修饰方法A和B,这两个方法是互斥的吗? 文章目录1. 同一实例互斥2. 不同实例不互斥3. 特殊情况静态方法static总结表简单直接的回答是这取决于这两个方法是被同一个对象实例调用还是被不同的对象调用。在 Java 中synchronized 修饰非静态方法时锁住的是当前的实例对象this。1. 同一实例互斥如果两个线程同时访问同一个对象的 A 方法和 B 方法它们是互斥的。原因当线程 1 进入方法 A 时它获取了该实例的“对象锁”。结果线程 2 想要进入方法 B 时发现同一个对象的锁正被占用只能在同步队列中等待直到线程 1 释放锁。2. 不同实例不互斥如果线程 1 访问对象 obj1 的方法 A线程 2 访问对象 obj2 的方法 B它们不互斥。原因每个对象都有自己独立的一把锁。线程 1 拿的是 obj1 的锁线程 2 拿的是 obj2 的锁。结果两把锁互不干扰两个方法会并行执行。3. 特殊情况静态方法static如果方法 A 和 B 都是 static synchronized那么无论你创建多少个实例它们都是互斥的。原因静态锁锁定的是整个Class 对象例如 YourClass.class而一个类在 JVM 中只有一个 Class 对象。总结表情况访问方式是否互斥普通同步方法同一实例 (obj1.A() 和 obj1.B())是普通同步方法不同实例 (obj1.A() 和 obj2.B())否静态同步方法任意实例 (obj1.A() 和 obj2.B())是一句话总结synchronized 保护的是“锁对象”。只要两个线程争抢的是同一把锁它们就互斥否则各走各的路。