Java ConcurrentHashMap的values()是线程安全的吗?

Java ConcurrentHashMap的values()是线程安全的吗?,java,concurrency,concurrenthashmap,Java,Concurrency,Concurrenthashmap,我是Java8新手,正在处理多个线程(~10)将值写入并发哈希映射的问题。我有另一个专用线程,它读取并发哈希映射中的所有值并返回它们(每30秒一次)。在result of values()方法上迭代是否是在不获取并发修改异常的情况下获取结果的推荐方法 注意:我对获取过时数据非常满意 我查阅了官方文件,上面说: 检索操作通常不会阻塞,因此可能与更新操作重叠。检索反映了最近完成的更新操作在开始时的结果。对于聚合操作(如putAll和clear),并发检索可能只反映插入或删除某些条目。类似地,迭代器、

我是Java8新手,正在处理多个线程(~10)将值写入并发哈希映射的问题。我有另一个专用线程,它读取并发哈希映射中的所有值并返回它们(每30秒一次)。在result of values()方法上迭代是否是在不获取并发修改异常的情况下获取结果的推荐方法

注意:我对获取过时数据非常满意

我查阅了官方文件,上面说:

检索操作通常不会阻塞,因此可能与更新操作重叠。检索反映了最近完成的更新操作在开始时的结果。对于聚合操作(如putAll和clear),并发检索可能只反映插入或删除某些条目。类似地,迭代器、拆分器和枚举返回元素,这些元素反映了在迭代器/枚举创建时或创建之后某个点的哈希表状态。它们不会抛出ConcurrentModificationException

然而,doc of values()方法表示:

返回此映射中包含的值的集合视图

下面的代码是线程安全的吗

for (String name: myMap.values()) {
     System.out.println("name": + name);
}
  for (String name: myMap.values()) {
       System.out.println("name": + name); 
  }
迭代
values()
方法的结果是否是在不获取
ConcurrentModificationException的情况下获取结果的推荐方法

对。这是推荐的方法,您不会得到
ConcurrentModificationException

正如包级javadoc所述:

大多数并发集合实现(包括大多数队列)也不同于通常的java.util约定,因为它们的迭代器和拆分器提供弱一致性而不是快速失败遍历:

  • 他们可以与其他行动同时进行
  • 他们永远不会抛出
    ConcurrentModificationException
  • 它们保证在施工时只穿过一次图元,并且可能(但不保证)反映施工后的任何修改

下面的代码是线程安全的吗

for (String name: myMap.values()) {
     System.out.println("name": + name);
}
  for (String name: myMap.values()) {
       System.out.println("name": + name); 
  }
是的。。。有一些资格

线程安全实际上意味着代码在多线程应用程序中按照其指定的行为工作。问题是,您没有清楚地说明您希望代码实际做什么

我们可以说:

  • 迭代将看到符合前面所述保证的值
  • 内存模型的保证意味着不应该有任何讨厌的行为与陈旧的价值观。。。除非在将值对象放入地图后对其进行变异。(如果这样做,则需要实现对象的方法来处理此问题;例如,它们可能需要进行
    同步
    。这对于
    字符串
    值是没有意义的,因为它们是不可变的。)

  • 是的,它是线程安全的。您刚才引用了答案:“类似地,迭代器、拆分器和枚举返回元素,反映了在迭代器/枚举创建时或创建之后的某个时刻哈希表的状态”。该语句包括
    entrySet()
    keySet()
    keys()
    values()
    元素()。