我使用这种模式已经有一段时间了,但直到最近我才开始认为这样做可能不太好。基本上,我使用这种模式的一些变体:
public class SampleJavaAsync
{
public SampleJavaAsync() { }
private boolean completed;
public void start()
{
new Thread(new Runnable() {
@Override
public void run() {
//... do something on a different thread
completed = true;
}
}).start();
}
public void update()
{
if (!completed) return;
//... do something else
}
}
*用户有责任确保start
只调用一次。update
随时随地被调用。
我一直认为这在 Java 中是线程安全的,因为即使没有严格同步,我也只设置completed
为 true。一旦被观察到true
,它就不会重置为false
。它在构造函数中被初始化为 false,根据定义这是线程安全的(除非你在其中做了一些愚蠢的事情)。那么,以这种方式使用不可重置标志是线程安全的吗?(如果是这样,它甚至会提供任何性能优势吗?)
谢谢