Java中使用类的相同与不同实例时的双线程同步规则疑问
Java synchronized锁机制疑问解答
首先明确两个核心规则:
- 普通非静态
synchronized方法:锁对象是当前调用方法的类实例,每个类实例有独立的实例锁,不同实例的锁互不干扰 static synchronized静态同步方法:锁对象是当前类的Class对象,全局唯一,所有该类的静态同步方法共用这一把锁
非静态同步方法场景
对应代码:
public class Demo { public synchronized void methodA(){ System.out.println("Method A"); } public synchronized void methodB(){ System.out.println("Method B"); } public static void main(String[] args) { Demo demo = new Demo(); Demo demo1 = new Demo(); Thread thread1 = new Thread(() -> demo.methodA()); thread1.start(); Thread thread2 = new Thread(() -> demo1.methodB()); thread2.start(); } }
情况2解答
不会互相阻塞。两个线程分别调用demo和demo1两个不同实例的同步方法,各自获取的是对应实例的锁,两把锁互相独立不存在竞争,因此两个线程可以并行执行,不会出现互斥阻塞。
静态同步方法场景
对应代码:
public class Demo { public static synchronized void methodA(){ System.out.println("Method A"); } public static synchronized void methodB(){ System.out.println("Method B"); } public static void main(String[] args) { Demo demo = new Demo(); Demo demo1 = new Demo(); Thread thread1 = new Thread(() -> demo.methodA()); thread1.start(); Thread thread2 = new Thread(() -> demo1.methodB()); thread2.start(); } }
情况3解答
会互相阻塞。静态同步方法的锁是Demo.class类对象,和调用方法的实例无关,即使用同一个实例调用两个不同的静态同步方法,本质上还是竞争同一把类锁,同一时间只能有一个方法执行,因此会互相阻塞。
情况4解答
仍然会互相阻塞。静态同步方法的锁是全局唯一的类锁,不管用哪个实例调用静态同步方法,最终竞争的都是同一把Demo.class锁,因此即使是不同实例调用不同的静态同步方法,也会出现互斥阻塞。
内容的提问来源于stack exchange,提问作者Jeff Cook
相关产品推荐
相关产品推荐

