2014-03-01 74 views
2
1   if (!vector.contains(element)) 
2    vector.add(element); 

上述代碼不是線程安全的,因爲競爭條件或複合動作發生在向量中。向量中的競態條件

我不要;知道它是如何發生的

如果一個線程進入1號線,並得到一個鎖,並持有該鎖,然後其他線程可以獲取鎖和呼叫線路2那麼,是競爭條件

是我的理解正確還是錯過了一些觀點? 請詳細解釋

+1

你的代碼在哪裏?向量不是併發結構。 –

回答

6

向量是線程安全的,因爲它的方法是線程安全的。你有兩個獨立的矢量調用。這意味着競爭條件存在問題。

  1. 線程A執行包括(),並得到假
  2. 線程B執行包括(),並得到假
  3. 線程A執行增加,並增加你的元素
  4. 線程B執行所增加,再次增加了你的元素

要解決此問題,您需要將呼叫同步到矢量。如果這是撥打電話的唯一區域,就像

synchronized(vector) { 
    if(!vector.contains(element)) 
     vector.add(element); 
} 
+1

一旦你需要外部同步訪問,最好使用非同步類型(如ArrayList或HashSet)並使用Lock或ReadWriteLock來同步所有訪問。 –

+0

這是一個非常好的點Brett。此時取決於其他代碼,ArrayList可能會更好。 –

+0

根據添加的對象的類型/數量,HashSet(或其他Set實現)可能是一個不錯的選擇,因爲包含調用。 –