2015-12-05 17 views
-3

考慮下面的類:如果一個方法檢查(獨立)A並且然後作用於B,是否包含競爭條件?

public class CheckThenAct 
{ 
    private volatile boolean flag = false; 
    public void setFlag(boolean flag) { this.flag = flag; } 
    public boolean getFlag() { return flag; } 

    private final Map<String, String> map = new ConcurrentHashMap<>(); 
    public void removeIfFlag(String x) 
    { 
     if (flag) 
      map.remove(x); 
    } 
} 

是否removeIfFlag(String)包含一個競爭條件?

到目前爲止,我已經閱讀的唯一示例具有條件和寫法,這些條件和寫法在某種程度上相互關聯(例如在相同集合對象上進行檢查和寫入) - 在這種情況下,這兩個字段之間沒有約束,他們不是同一個對象。

+1

好吧,不是Java語言規範定義的一種* data-race *本身。但是你可能有一個原子性問題。此代碼是「線程安全的」,但可能無法按照您的要求運行。 – markspace

回答

1

假設您有一個線程調用setFlag(true),另一個線程調用removeIfFlag

如果沒有什麼能夠確定哪個線程首先進入標誌(即,如果線程不同步/協調/互鎖/無論你怎麼稱呼它),那麼這就是數據競賽。

如果程序的輸出取決於哪個線程贏得比賽,那麼這是一個比賽條件

如果您的程序的正確性取決於哪個線程贏得比賽,那麼這是一個錯誤。

+0

謝謝。那正是我正在尋找的答案。 – RAnders00

相關問題