You need to enable JavaScript to run this app. Java synchronized同步代码未出现预期死锁问题求解
优惠活动
大模型
产品
解决方案
定价
更多

Java synchronized同步代码未出现预期死锁问题求解

问题核心原因解释

你的死锁推论错误源于对Object.wait()方法的语义认知不全:在同步块/同步方法内调用wait()时,当前线程会主动释放持有的对象锁,进入对应对象的等待队列,直到被notify()/notifyAll()唤醒、或者被中断,才会重新参与锁竞争,竞争成功后才会从wait()调用的位置继续往下执行。

代码实际执行流程(你假设的threadEating先拿到锁的场景)

  • threadEating先获取到PizzaHouse实例的对象锁,进入eatPizza()方法,此时pizzaArived值为false,进入循环,打印waiting后调用wait()
  • wait()调用生效的瞬间,threadEating立即释放持有的PizzaHouse对象锁,进入该对象的等待集合
  • threadDelivering此时可以顺利拿到PizzaHouse对象锁,执行deliverPizza()方法:将pizzaArived设为true,打印Pizza delivered,调用notifyAll()唤醒所有在该对象等待队列中的线程(即threadEating),方法执行完毕后释放对象锁
  • 被唤醒的threadEating重新竞争到对象锁,从wait()调用的位置恢复执行,此时判断pizzaArived已经为true,退出循环,打印Eating pizza,方法执行完毕释放锁,整个流程正常结束

补充说明

即便实际运行时threadDelivering比threadEating先抢到锁执行,也不会出现问题:deliverPizza()会先把pizzaArived设为true并发送通知,之后threadEating拿到锁进入eatPizza()时,会直接判断pizzaArived为true,不会进入wait逻辑,直接打印吃披萨的信息,流程依然正常。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.21 08:54:03