gpt4 book ai didi

java - CopyOnWriteArraySet 何时对实现线程安全的 HashSet 有用?

转载 作者:搜寻专家 更新时间:2023-10-30 19:41:34 26 4
gpt4 key购买 nike

Java ,有线程安全版本HashMap命名为ConcurrentHashMap和线程安全版本 TreeMap命名为ConcurrentSkipListMap , 但没有 ConcurrentHashSet对于HashSet .

相反,通常有 4 种方式使用线程安全 Set :

  1. Set<String> mySet = Collections.newSetFromMap(new ConcurrentHashMap<String, Boolean>());
  2. Set<String> s = Collections.synchronizedSet(new HashSet<String>());
  3. ConcurrentSkipListSet<E>
  4. CopyOnWriteArraySet<E>

1 使用 keySet()ConcurrentHashMap实现两者 Set并且是线程安全的。

2 使用 synchronized方式,似乎不推荐这种方式。

3 基于ConcurrentSkipListMap并被广泛使用。

4 基于CopyOnWriteArrayList , 因此它与 CopyOnWriteArrayList 具有相同的基本属性.以下选自CopyOnWriteArraySet文档:http://docs.oracle.com/javase/8/docs/api/java/util/concurrent/CopyOnWriteArraySet.html

  • 它最适合集合大小通常保持不变的应用程序小型只读操作的数量远远超过可变操作,并且您需要防止遍历期间线程之间的干扰。
  • 它是线程安全的。
  • 可变操作(添加、设置、删除等)非常昂贵,因为它们通常需要复制整个底层数组。
  • 迭代器不支持可变删除操作。
  • 迭代器遍历速度快,不会受到其他线程的干扰。
  • 迭代器依赖于构造迭代器时数组不变的快照。

既然1和3常用,为什么CopyOnWriteArraySet存在?什么时候CopyOnWriteArraySet有用吗?

已添加: CopyOnWriteArraySet基于CopyOnWriteArrayList , 和 containsList 运行数据结构是O(n),而Set数据结构是为了高性能contains操作,有人可以解释一下吗?

最佳答案

当你有一个线程安全集合的一小组元素时,它很有用。

一个例子是一组监听器。您需要确保唯一性并有效地迭代它们。

顺便说一句,CopyOnWriteArraySet 在每个引用的基础上具有最低的开销。它可以小到其他集合大小的 1/6。如果您有很多,这将特别有用。

while Set data structure is for high performance contains operation, could anybody explain this?

COWAS 在内存方面效率更高,而且它的 contains 对于小型集合比替代方案更快。什么是“高性能”取决于用例。

关于java - CopyOnWriteArraySet 何时对实现线程安全的 HashSet 有用?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29249714/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com