为什么这个测试程序会导致java.lang.IllegalMonitorStateException?publicclasstest{staticIntegerfoo=newInteger(1);publicstaticvoidmain(String[]args){synchronized(foo){foo++;foo.notifyAll();}System.err.println("Success");}}结果:Exceptioninthread"main"java.lang.IllegalMonitorStateExceptionatjava.lang.Object.notifyA
我对等待和通知/通知所有有点困惑。我知道每个java对象都有一个锁。我知道等待会释放其他线程的锁。notify/notifyall怎么样?notify/notifyAll是否释放它为其他线程持有的锁? 最佳答案 No--notify/notifyAll不像wait那样释放锁。在调用notify的代码释放锁之前,被唤醒的线程无法运行。Javadoc是这么说的:Thethreadreleasesownershipofthismonitorandwaitsuntilanotherthreadnotifiesthreadswaitingon
如果Google搜索“notify()和notifyAll()之间的差异”,那么会弹出很多解释(撇开javadoc段落)。这一切都归结为被唤醒的等待线程的数量:notify()中的一个和所有在notifyAll().但是(如果我确实理解这些方法之间的区别的话),始终只选择一个线程进行进一步的监视器采集;在第一种情况下是由VM选择的,在第二种情况下是由系统线程调度程序选择的。程序员不知道它们(在一般情况下)的确切选择过程。什么是有用notify()之间的区别和notifyAll()然后?我错过了什么吗? 最佳答案 However(if