我能从中得到什么样的一致性行为 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上。请随意提出改进建议,如果它增加了答案,但请只提供回答我的实际问题的答案。我不是在问如何使这个更好,我只是想知道在我的例子中所有部分是如何相互作用的。
暂无答案!
目前还没有任何答案,快来回答吧!