这是某种Java Puzzler,我偶然发现并无法真正解释。也许有人可以?
以下程序在短时间内挂起。有时在 2 次输出之后,有时在 80 次之后,但几乎总是在正确终止之前。如果第一次没有发生,您可能需要运行几次。
public class Main {
public static void main(String[] args) {
final WorkerThread[] threads = new WorkerThread[]{ new WorkerThread("Ping!"), new WorkerThread("Pong!") };
threads[0].start();
threads[1].start();
Runnable work = new Runnable() {
private int counter = 0;
public void run() {
System.out.println(counter + " : " + Thread.currentThread().getName());
threads[counter++ % 2].setWork(this);
if (counter == 100) {
System.exit(1);
}
}
};
work.run();
}
}
class WorkerThread extends Thread {
private Runnable workToDo;
public WorkerThread(String name) {
super(name);
}
@Override
public void run() {
while (true){
if (workToDo != null) {
workToDo.run();
workToDo = null;
}
}
}
public void setWork(Runnable newWork) {
this.workToDo = newWork;
}
}
现在,很明显,繁忙的等待循环通常不是一个好主意。但这不是关于改进,而是关于了解正在发生的事情。
由于一切都按预期工作,WorkerThread.setWork()
或者synchronized
当该WorkerThread.workToDo
字段设置为时,volatile
我怀疑存在内存问题。
但究竟为什么会发生呢?调试无济于事,一旦您开始单步执行,一切都会按预期运行。
解释将不胜感激。