影響

2013-02-04 55 views
0

我跑進其中HashSet是在同一時間訪問和修改由多個線程一些陰暗的一段代碼,我想知道是什麼效果,這可能不得不考慮的Javadoc只在併發,非同步訪問下解釋行爲是「非確定性」的。影響

具體而言,是有可能,以remove(element)回報true一個電話,但電話的作用不會被其他線程見過(即contains(element)總會在其他線程返回true)?

PS:只是向你保證,我知道這個代碼是壞的,我會用等效同步採集更換HashSet

回答

2

在多個線程可以訪問HashSet的。

  • 導致您不會被另一個線程看到的更改。
  • 迭代器失敗並出現ConcurrentModifcationException。
  • 一個線程進入HashSet的碼內的無限循環(罕見,但是當它確實很糟糕)

注:一個簡單的替換是使用

Set<Type> set = Collections.newSetFromMap(new ConcurrentHashMap<Type, Boolean>()); 
+0

謝謝您的回答@Peter!你能爲我澄清一些事嗎?當你說「一個變化不被另一個線程看到」時,它是否認爲這個變化最終會被看到,或者一個(或多個)線程可能會無限期地拋棄一個變化的影響? – ahelix

+2

我通常假設爲併發的神恨我們,最壞的事情都可能發生 –

+0

@ahelix有根本沒有保障經驗法則。結果絕對不會被丟棄,但可見性可能無限期地推遲。更糟的是,各種單獨的修改可能在不同的時間可見,導致完全破壞的HashSet對象。 –