0


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


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

这个问题已被关闭,原因:问题已解决 - 问题已解决,且对他人无借鉴意义

5个回答

1

已采纳

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

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

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

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

说明它会释放锁的。

0

可以看看这里
Java多线程之内置锁与显示锁 - QueenKing - SegmentFault https://segmentfault.com/a/11...

0

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

0

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

0

谢谢各位的解答。

该答案已被忽略,原因:无意义的内容,赞、顶、同问等毫无意义的内容

这个问题已经被关闭无法回答