concurrenthashmap.keyset().stream()的一致性行为

z3yyvxxp  于 2021-07-09  发布在  Java
关注(0)|答案(0)|浏览(213)

我能从中得到什么样的一致性行为 modify 方法与 ConcurrentHashMap ?

// map is filled concurrently from multiple threads
private final ConcurrentHashMap<String, Object> map = new ConcurrentHashMap<>();

public void modify(Object newValue) {
  map.keySet().stream()
    .filter(/* some filter */)
    .forEach(k -> {
      if (/* k has some property */) {
        map.put(k, newValue);
      } else {
        map.remove(k);
      }
    });
}

我发现很难从阅读javadocs中得到一个明确的答案 keySet() , stream() ,并且流中Map条目的修改会相互作用。我知道 keySet()spliterator 是弱一致的,因此流至少应该遍历所有元素,因为它们在过去的某个时刻只存在一次。并且在流执行期间修改数据源对于并发集合是受支持的(请参阅非干扰)。这可能是相关的,我总是修改当前的关键只有,而不是接触其他Map条目中 foreach 拉姆达。
那么上面的代码是否以弱一致的方式“都很好”,或者是否有一些我应该注意的注意事项?
注意:上面的代码也没有真正意义,但是这是简化的代码,没有考虑其他与并发无关的方面。
使用不同的方法可以更好地编写代码。 forEach 在Map上。请随意提出改进建议,如果它增加了答案,但请只提供回答我的实际问题的答案。我不是在问如何使这个更好,我只是想知道在我的例子中所有部分是如何相互作用的。

暂无答案!

目前还没有任何答案,快来回答吧!

相关问题