You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.29 04:48:03