在任何情况下都可以在ThreadA中获得“永远等待”的情况。我的意思是通知执行速度比b.sync.wait();
class ThreadA {
public static void main(String [] args) {
ThreadB b = new ThreadB();
b.start();
synchronized(b.sync)
{
try
{
System.out.println("Waiting for b to complete...");
b.sync.wait();
System.out.println("waiting done");
} catch (InterruptedException e) {}
}
}
}
class ThreadB extends Thread {
int total=0;
Integer sync = new Integer(1);
public void run() {
synchronized(sync)
{
sync.notify();
}
}
}
答案 0 :(得分:2)
是的,有可能。一旦你调用b.start()
,调度程序可以选择运行线程B,当线程A没有等待锁定时,它将立即获得锁定和调用通知。在这种情况下,威胁A将在以后获得锁定并继续等待。
如果您需要确定性行为,只有在您开始等待通知后才应致电b.start()
。
答案 1 :(得分:0)
无法保证线程的执行顺序。有可能(并且,据我记得,线程如何在Java中工作),通知将在调用wait()之前发生。
你几乎不可能认为某件事会在另一件事之前发生。
有关创建之前发生关系的操作列表,请参阅:Java Memory Visibility或The Java™ Language Specification的第17章