Java
有線程安全版本HashMap,命名爲ConcurrentHashMap,線程安全版本TreeMap命名爲ConcurrentSkipListMap,但HashSet沒有ConcurrentHashSet
。什麼時候CopyOnWriteArraySet對實現線程安全的HashSet有用?
相反,通常有4種方式使用線程安全Set
:
Set<String> mySet = Collections.newSetFromMap(new ConcurrentHashMap<String, Boolean>());
Set<String> s = Collections.synchronizedSet(new HashSet<String>());
ConcurrentSkipListSet<E>
CopyOnWriteArraySet<E>
1使用ConcurrentHashMap
keySet()
實現均爲Set
和線程安全。
2使用的方式,似乎不推薦這種方式。
3是基於ConcurrentSkipListMap
而被廣泛使用。
4基於CopyOnWriteArrayList,因此它具有相同的基本屬性CopyOnWriteArrayList
。以下是選擇從CopyOnWriteArraySet
DOC:http://docs.oracle.com/javase/8/docs/api/java/util/concurrent/CopyOnWriteArraySet.html
- 它是最適合於中集大小一般留 小,只讀操作遠多於可變操作應用程序,並 你需要防止遍歷期間線程間的干擾。
- 它是線程安全的。
- 突變操作(添加,設置,刪除等)很昂貴,因爲它們通常需要複製整個底層陣列。
- 迭代器不支持可變刪除操作。
- 通過迭代器遍歷很快,不會受到來自其他線程的干擾。
- 迭代器構建時,迭代器依賴於數組的不變快照。
由於1和3是常用的,爲什麼CopyOnWriteArraySet
存在? CopyOnWriteArraySet
何時有用?
補充:CopyOnWriteArraySet
基於CopyOnWriteArrayList
,並在List
數據結構contains
操作是O(n),而Set
數據結構是高性能contains
操作,可能有人解釋一下嗎?
在JDK中確實沒有這樣的本地類;你可以使用'Collections.newSetFromMap(new ConcurrentHashMap <>())'。 – fge 2015-03-25 07:25:24
另一個有用的材料:http://stackoverflow.com/questions/6720396/different-types-of-thread-safe-sets-in-java – coderz 2015-03-27 16:53:02