2013-10-04 16 views
0

以前的代碼就像;在向量上避免ConcurrentModificationException;哪裏需要迭代;它在該向量的同步塊內執行。所以它通過使多個線程進入BLOCKED狀態來獲取在不同的API上的該Vector上的鎖定而導致非常差的性能。如何在Sets.newSetFromMap上執行clone()(map)

我決定在我的項目中將Vector更換爲Collections.newSetFromMap(new ConcurrentHashMap<psConference,Boolean>());

所以在將Vector更改爲Concurrent集合後,我已經刪除了所有的SYNCH塊。

但是,這裏的問題是我的一些代碼是在該Vector上執行clone()。

  1. 如何做到這一點,因爲我只有設置界面?
  2. Vector clone()是深度克隆還是淺克隆?
  3. 也請告訴我,布爾的意義在ConcurrentHashMap<psConference,Boolean>

回答

1

但這裏的問題是我的一些代碼正在執行克隆()在那個 向量。

如何做到這一點,因爲我只有設置界面?

您現在正在使用Set,而不是Vector。您的SetConcurrentHashMap支持,因此可以安全地同時迭代。而不是克隆我會建議你使用複製構造函數。

但要注意(從javadocs):

不過,迭代器被設計成只有一個線程在 時使用。

話雖這麼說,你也可以使用一個CopyOnWriteArrayList,但你必須要小心那裏,因爲寫入是昂貴和Iterator不支持元素更改操作。

Vector clone()是深克隆還是淺克隆?

克隆製作引用的副本,因此很淺。

也請告訴我的Boolean意義在 ConcurrentHashMap<psConference,Boolean>

Boolean值只是一個佔位符,因爲你使用的是MapSet。如果您查看Collection課程的來源,您將會看到在添加元素時始終使用Boolean.TRUESet的實際使用的容器是Map#keySet()。所以Boolean參數在這裏實際上沒有什麼,只是一個佔位符。

+0

非常感謝你!我不知道「迭代器被設計爲一次只能被一個線程使用」這一點。我認爲多個迭代器可以同時用於多個線程。我的錯!!!! –

+0

親愛的@ortang;你能否也請回答我的相關問題http://codereview.stackexchange.com/questions/32280/sychronized-block-over-concurrent-collections –

0

就個人而言,我寧願避免併發問題儘可能。你可能會發送一個代碼引發ConcurrentModificationException的例子嗎?也許有一種方法可以重新設計算法來避免它們。

此外,我寧願使用ArrayList來代替Vector

要回答你的觀點(2),基於這個explanation,我會說Vector clone()可能是一個淺層克隆。順便說一句,他們也表示通常避免使用clone()方法會更好。

+0

謝謝!本;但是SYNCHRONIZED集合必須被另一個SYNCH集合取代以確保線程安全。它是使用ConcurrentHashMap而不是Hashtable的小孩,可以在多線程環境中獲得更好的性能。 –

0

請記住,併發版本的集合不會自動使併發錯誤消失。

在你的情況下,你最好的選擇是創建具體的包裝類來實現你期望的集合接口,將所有必要的方法委託給包裝的集合,但知道使用的數據類型並知道如何創建副本的自己。