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
相关产品推荐
相关产品推荐

