2015-10-01 35 views
0

我有一個線程每5分鐘定期運行一次,它可能會更改標誌的值,並且許多線程讀取該標誌。如果以下設計有任何問題,請提出建議。我選擇volatile,所以每個線程都得到正確的標誌值並且不緩存。我沒有看到AtomicBoolean在這裏很有意義。易變vs原子布爾

Class A { 
private static volatile boolean flag = false; 

//Calls every 5 minutes 
//Value of this flag may change every 5 minutes by thread. 
checkAndSetFlag(boolean newFlag) { 
    flag= newFlag; 
} 
} 

許多線程將只檢查值如下。如果某些線程在值改變的同時讀取舊值,我沒有問題。

Class B { 
    doSomething() { 
    if(A.flag) { 
     doSomethingElse(); 
    } 
    } 
} 
+0

這不是一個完全相同的副本。擬議的複製方式有許多作者線程和單個讀者,而在這個問題中反過來也是如此。這些細微的差異在多線程問題中很重要。 –

回答

0

AtomicBoolean和volatile在您的使用(單個作者)中具有完全相同的語義,因此任何一個都可以工作。 AtomicBoolean(或任何Atomic類)的情況是當你必須處理多個潛在的作者。

+0

謝謝。除了Brian Goetz的Concurrency之外,您還有其他建議嗎?任何討論論壇,我可以討論這些問題? –

+0

對不起,不知道這樣的高級話題的任何好的在線論壇。實踐中的併發性當然是非常棒的。 – jtahlborn