【问题标题】:Does Set of ConcurrentHashMap is thread safe in foreach?ConcurrentHashMap 的集合在 foreach 中是线程安全的吗?
【发布时间】:2018-01-31 23:54:04
【问题描述】:

用下一组在不同线程中执行foreach、add、remove、size操作安全吗?

private final Set<MyObject>  myConcurrentHashSet = ConcurrentHashMap.newKeySet();

即我不需要在 foreach 或 size 操作中获得最大的准确性,但我需要确保在执行 foreach / add / remove / size 操作时不会出现任何异常。

我知道 ConcurrentHashMap 是线程安全的,但我对其 Set 的线程安全感到困惑。

【问题讨论】:

  • @Yogesh_D 它不是重复的,他询问有关 concurrentHashMap 上的 Set 视图,该视图没有很好地记录。 newKeysSet() 的注释文档很差。
  • @KrzysztofCichocki “但我需要确保在执行 foreach / add / remove / size 操作时不会出现任何异常。”因为这个。

标签: java multithreading concurrency thread-safety java.util.concurrent


【解决方案1】:

是的,keySet 视图是线程安全的,java 中的 newKeySet >=8 等价于这个 java 7 形式:

对于 java

ConcurrentHashMap c = ...;
Set threadSafeSet = c.keySet();

对于 java >=8

Set threadSafeSet =  ConcurrentHashMap.newKeySet();

【讨论】:

    【解决方案2】:

    来自ConcurrentHashMap 文档:

    检索操作(包括get)一般不会阻塞,所以可能 与更新操作重叠(包括放置和删除)。检索 反映最近完成的更新操作的结果 坚持他们的发病。 (更正式地说,一个更新操作 给定的键与任何(非空)具有发生前的关系 检索报告更新值的那个键。)
    . .

    类似地,迭代器、拆分器和枚举返回元素反映 哈希表在创建之时或之后的某个时间点的状态 迭代器/枚举。他们不扔 并发修改异常。但是,迭代器被设计为 一次只能由一个线程使用。

    【讨论】:

    • 如果您投票决定将问题作为重复问题结束,您为什么要回答?另外,您只需重复我已经回答的内容,然后复制文档即可...
    猜你喜欢
    • 1970-01-01
    • 2012-08-20
    • 1970-01-01
    • 2019-09-22
    • 1970-01-01
    • 2011-04-15
    • 1970-01-01
    • 2021-04-27
    • 2014-03-04
    相关资源
    最近更新 更多