我是新手,当发现问题时发现并发和不确定自己时,我正在查看相当成熟的代码库,并找到了下面的代码(为了简洁起见),我相信易受数据种族:多线程代码中的非易失性状态标志
public class Example extends Thread {
boolean condition = false;
public void run() {
while (true) {
synchronized (this) {
try {
while(condition) wait();
}
catch (InterruptedException e) { /*for brevity*/ }
}
// non-blocking computation
}
}
public void setTrue() { condition = true; }
public void setFalse() {
synchronized (this) {
condition = false;
this.notifyAll();
}
}
}
据我理解,因为即使在synchronized块,编译器不会发出任何内存屏障condition
必须是挥发性的;如果这是一个不稳定的商店condition
在setTrue
编译器会发出StoreEnter.
我是否有权相信上述容易受到数据竞争?如果是的话,我怎么能通过一个例子来见证数据竞赛(而不是简单地知道JMM提供的保证)。线程中随机调用setTrue
的简单测试不会发现数据竞争。
此外,我相信使用notifyAll在这里是过度杀伤,因为有一个条件来检查,只有一个线程将永远等待它,对吗?
谢谢。
除非您确实有理由,否则不要扩展Thread类。最好是实现Runnable接口并向Thread构造函数提供你的类的一个实例。 – gparyani