0


如图,两个方法中的synchronized块锁的是同个对象,所以每次只能先执行一个方法,等先抢的锁的方法执行完,后面的方法才能去执行,这样理解有没问题?


如果我上面理解没问题的话,那我这块代码不能理解,我用sleep方法先让consume()抢得object锁,然而
它理应是进入了wait状态,一直没释放object锁,所以我的理解就是这是一个死锁,因为product()synchronized块要获取的object在consume()方法还没释放,而consume()方法却一直在wait等待别人notify()它。但是结果却不是死锁,结果如下,谁能帮我解惑吗?如果描述的不清楚,欢迎提问,我再理清下描述,感谢!

查看全部 5 个回答

0

其实wait之后,锁就已经释放了。

推荐答案

1

已采纳

题主对java.lang.Object.wait() 的理解出现偏差了,并不是题主所认为的:

它理应是进入了wait状态,一直没释放object锁,所以我的理解就是这是一个死锁

恰恰相反,方法原文说明里有一句:

The thread then waits until it can re-obtain ownership of the monitor and resumes execution.

说明它会释放锁的。