我有以下代码:
public class Nit extends Thread {
public void run() {
try {
synchronized(this) {
this.wait();
}
System.out.println("AAA");
} catch (InterruptedException e) {
e.printStackTrace();
}
}
public static void main(String[] args) {
Nit n = new Nit();
n.start();
synchronized(n) {
n.notify();
}
}
}
当我从cmd运行它时,它永远不会像死循环那样退出。我不明白为什么。我唯一能想到的是
Nit n
仍在等待,但我不明白为什么? 最佳答案
您正在观察种族状况。在等待发生之前,您通知。因此,等待坐在那里,永远等待。
如果您经常调用此代码,您可能会看到它有时通过-当新线程的运行速度快于主线程时。使示例工作的一种方法:尝试在Thread.sleep(1000)
之前添加对notify()
的调用。或者,甚至在主线程上调用println()(在notify()
可能会改变时序之前)。
除此之外:这些微妙之处是您实际上避免使用“低级”原语(例如,等待/通知)的主要原因。相反,您使用标准API必须提供的功能强大的抽象(例如队列)。