java 会以一致的方式对 ConcurrentHashMap 的值求和吗?

Tha*_*Guy 3 java concurrenthashmap java-stream

我有一个 concurrentHashMap 实例,一些线程向其中添加了条目。这些值是整数。

同时,其他线程希望检索映射中所有值的总和。我希望这些线程看到一致的值。但是,它们不必总是看到最新的值。

以下代码线程安全吗?

import java.util.Map;
import java.util.concurrent.ConcurrentHashMap;

public class MyClass {
    private Map<Integer, Integer> values = new ConcurrentHashMap<>();

    public void addValue(Integer key, int value){
        values.put(key, value);
    }

    public long sumOfValues(){
        return values
                .values()
                .stream()
                .mapToInt(Integer::intValue)
                .sum();
    }
}
Run Code Online (Sandbox Code Playgroud)

求和运算会在一组一致的值上计算吗?

当 sum 运算发生时,对 put() 的调用会被阻塞吗?

当然我可以自己同步访问,甚至可以拆分读写锁以允许并发读访问和同步写访问,但是我很好奇在使用 concurrentHashMap 作为集合实现时是否有必要。

gur*_*oso 6

文件说,有关ConcurrentHashMapkeySet()entrySet()视图的迭代器和spliterators是弱一致。

弱一致特征为

  • 他们可以与其他操作同时进行
  • 他们永远不会抛出 ConcurrentModificationException
  • 它们保证遍历元素,因为它们在构造时就存在过一次,并且可能(但不保证)反映构造后的任何修改。

所以...

以下代码线程安全吗?

是的,狭义上没有 ConcurrentModificationException 或 HashMap 的内部不一致。

求和运算会在一组一致的值上计算吗?

在弱一致集上

当 sum 运算发生时,对 put() 的调用会被阻塞吗?