CopyOnWriteArraySet何时可用于实现线程安全的HashSet?
在 中,有名为 ConcurrentHashMap 的线程安全版本 HashMap 和名为 ConcurrentSkipListMap 的线程安全版本 TreeMap,但没有 HashSet。Java
ConcurrentHashSet
相反,通常有4种方法可以使用线程安全:Set
Set<String> mySet = Collections.newSetFromMap(new ConcurrentHashMap<String, Boolean>());
Set<String> s = Collections.synchronizedSet(new HashSet<String>());
ConcurrentSkipListSet<E>
CopyOnWriteArraySet<E>
1.使用实现两者兼而有之,线程安全。keySet()
ConcurrentHashMap
Set
2.使用方式,似乎这种方式是不推荐的。synchronized
3.基于并得到广泛应用。ConcurrentSkipListMap
4 基于 CopyOnWriteArrayList,因此它共享 相同的基本属性。以下是从文档中选择:http://docs.oracle.com/javase/8/docs/api/java/util/concurrent/CopyOnWriteArraySet.htmlCopyOnWriteArrayList
CopyOnWriteArraySet
- 它最适合于以下应用程序:在以下应用程序中,集合大小通常保持较小,只读操作的数量远远超过突变操作,并且您需要在遍历期间防止线程之间的干扰。
- 它是线程安全的。
- 突变操作(添加、设置、删除等)成本高昂,因为它们通常需要复制整个底层阵列。
- 迭代器不支持突变删除操作。
- 通过迭代器进行遍历速度很快,并且不会遇到来自其他线程的干扰。
- 迭代器依赖于构造迭代器时数组的不变快照。
既然1和3是常用的,为什么存在?什么时候有用?CopyOnWriteArraySet
CopyOnWriteArraySet
补充:基于,数据结构中的运算是O(n),而数据结构是高性能运算,谁能解释一下呢?CopyOnWriteArraySet
CopyOnWriteArrayList
contains
List
Set
contains