我一直在使用這種模式,但我最近纔開始認爲這樣做可能不行。基本上,我使用這個模式的一些變種:Java中的不可修復「標誌」線程安全嗎?
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,這在定義中是線程安全的(除非你在其中做了一些愚蠢的事情)。那麼,以這種方式使用不可復位的標誌是否安全? (如果是的話,它甚至提供任何性能優勢?)
感謝
謝謝你的回答! – aboveyou00 2013-05-09 13:15:10