多线程synchronized块的问题

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

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

clipboard.png

阅读 3.8k
5 个回答

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

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

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

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

说明它会释放锁的。

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

wait()方法-----------》 让当前进程进入线程池等待并释放同步锁
notify()方法------------》随机的唤醒线程池中等待的线程

推荐问题