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

Java中synchronized修饰方法后仍出现异步输出的原因是什么

Java synchronized关键字未达到预期同步效果的原因

你代码中的synchronized关键字实际上已经生效,你观察到的输出交叉并不是方法异步执行的结果,而是锁粒度设置问题导致的正常现象,具体原因如下:

  • synchronized修饰非静态实例方法时,锁的是方法所属的对象实例,你的两个线程共用同一个Printer实例ob,所以确实同一时间只有一个线程能进入printHi方法执行,不存在两个线程同时输出的情况。
  • 你目前的锁粒度仅覆盖单次printHi方法调用:方法执行完成(单条内容输出结束)后,锁就会立即释放,两个线程会重新竞争锁资源。锁竞争的结果由操作系统的线程调度策略决定,所以会出现两个线程交替输出、或是单个线程连续多次拿到锁输出多条内容的情况。

如果你想要实现「一个线程先输出完全部10条内容,另一个线程再开始输出」的效果,只需要把锁的粒度放大到覆盖整个循环即可,修改示例如下:

@Override
public void run() {
    // 锁同一个Printer实例,覆盖整个循环逻辑
    synchronized (objm) {
        for (int i = 0; i < 10; i++) {
            objm.printHi("MyThread" + i);
        }
    }
}

YourThread的run方法做相同修改即可。

内容的提问来源于stack exchange,提问作者Hari Krishnan

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.06 10:06:00