在使用wait()、notify()、notifyAll()时删除关键字synchronized会在运行程序时引发错误,我知道wait()、notify()、notifyAll()必须包含在synchronized块中,以使使用它们的线程成为唯一拥有该代码块上的监视器的线程,但我的问题是:为什么在java中使用wait()、notify()、notifyAll()时,使用这部分代码的线程必须是唯一拥有其监视器的线程?
从包含wait()、notify()或notifyAll()的代码块中删除synchronized关键字时,会引发错误,但我找不到该错误的逻辑原因
2条答案
按热度按时间erhoui1w1#
要求持有对象上的锁解决了争用条件。
假设不需要同步:
现在线程A将永远等待。
使用同步:
2exbekwf2#
使用
synchronized
时,实际上是在锁定一个对象。一次只有一个线程可以锁定该对象。除非你调用
wait()
。如果是这样,另一个线程被允许进入该临界区,对该对象做它自己的事情,或者调用wait()
,或者通知其他对象保持器,允许他们继续进行wait()
调用。输出:
锁定单个对象允许您一次操作多个对象。
https://onecompiler.com/jshell/3ytda2qwz