1 if (!vector.contains(element))
2 vector.add(element);
上述代碼不是線程安全的,因爲競爭條件或複合動作發生在向量中。向量中的競態條件
我不要;知道它是如何發生的
如果一個線程進入1號線,並得到一個鎖,並持有該鎖,然後其他線程可以獲取鎖和呼叫線路2那麼,是競爭條件
是我的理解正確還是錯過了一些觀點? 請詳細解釋
1 if (!vector.contains(element))
2 vector.add(element);
上述代碼不是線程安全的,因爲競爭條件或複合動作發生在向量中。向量中的競態條件
我不要;知道它是如何發生的
如果一個線程進入1號線,並得到一個鎖,並持有該鎖,然後其他線程可以獲取鎖和呼叫線路2那麼,是競爭條件
是我的理解正確還是錯過了一些觀點? 請詳細解釋
向量是線程安全的,因爲它的方法是線程安全的。你有兩個獨立的矢量調用。這意味着競爭條件存在問題。
要解決此問題,您需要將呼叫同步到矢量。如果這是撥打電話的唯一區域,就像
synchronized(vector) {
if(!vector.contains(element))
vector.add(element);
}
一旦你需要外部同步訪問,最好使用非同步類型(如ArrayList或HashSet)並使用Lock或ReadWriteLock來同步所有訪問。 –
這是一個非常好的點Brett。此時取決於其他代碼,ArrayList可能會更好。 –
根據添加的對象的類型/數量,HashSet(或其他Set實現)可能是一個不錯的選擇,因爲包含調用。 –
你的代碼在哪裏?向量不是併發結構。 –