Java线程可以由以下任何一种持有:
就Java线程状态而言,以上两种方案之间有什么区别?
考虑以下简单代码:
synchronized(object) {
object.wait();
System.out.println("Completed.");
}
如果两个线程(例如ThreadA和ThreadB)都被保留在wait()方法中。例如,当另一个线程调用notifyAll()时,ThreadA将从等待中恢复并获得对对象的锁定并继续。ThreadB也将恢复,但无法获得对象上的锁定,并一直保持到ThreadA退出同步块为止。然后,线程B获得锁并继续。
结果将两个“ Completed”打印出来。
在此示例中,必须有一段时间ThreadB从“由wait()保持”变为“由于无法获取对象的锁而被保持”。
我想知道它在Java内部如何工作。请帮忙。
处于object.wait()
状态与等待监视器的锁定之间的区别object
是,处于该object.wait()
状态的线程将释放object
它所持有的所有监视器,并且它将与系统中的所有线程竞争以再次重新获取监视器。那是wait()
一种特殊的状态。
因此,在您的情况下,当A
and B
(线程A和线程B)处于等待状态时,它们没有用于监视的监视器object
,它们都已被暂停执行,直到其他线程调用object.notify()
或为止object.notifyAll()
。当notifyAll()
被称为JVM唤醒所有线程(在这种情况下A
,并B
在)object.wait()
的状态和他们竞争来获得当前的监视器synchronized
块。如果notify()
被调用,那么JVM会随机选择A或B。
这里要注意的是,JVM没有通知任何特定的线程,这就是每个等待线程都必须在while(notify_condition_for_me)
循环中等待的原因,该循环验证是否已经达到了等待条件(如果不是),则必须object.wait()
再次进入该状态。
所以正确的代码应该是
synchronized(object) {
while(myResourceArrived) {//like URL data, JDBC data or something
object.wait();
}
System.out.println("Completed.");
}
当A
和B
处于object.wait()
状态时,它们已经释放了先前保留的所有监视器object
,因此,在synchronized
块外部等待的任何其他线程都可以通过获取释放的Monitor来立即进入该块object
。
本文收集自互联网,转载请注明来源。
如有侵权,请联系 [email protected] 删除。
我来说两句