maa*_*nus 3 java concurrency concurrenthashmap
我积累了ConcurrentHashMap一些变化,应该定期发送到某个地方(用于某种复制)。关于更改,仅针对任何关键事项的最新值。
所以我需要获取并删除一些快照。快照不必是原子的,只要它的每个条目都反映操作期间某个时刻原始映射的状态就足够了。
重要的是,只有结果中存在且最新的条目才可以从原始地图中删除。我想,应该执行以下操作:
<K, V> ConcurrentMap<K, V> getAndRemoveAll(ConcurrentMap<K, V> map) {
ConcurrentHashMap<K, V> result = new ConcurrentHashMap<>(map);
result.forEach((resultKey, resultValue) ->
map.computeIfPresent(resultKey,
(k, mapValue) -> mapValue==resultValue ? null : mapValue));
return result;
}
Run Code Online (Sandbox Code Playgroud)
这真的正确吗?在单次迭代中可能吗?
您可以使用该方法,该方法仅在该值是最新的并且操作是原子的时remove(Object key, Object value)才会删除该条目。
所以这就是我的建议:
<K, V> Map<K, V> getAndRemoveAll(ConcurrentMap<K, V> map) {
return map.entrySet().stream()
.filter(e -> map.remove(e.getKey(), e.getValue()))
.collect(Collectors.toMap(Map.Entry::getKey, Map.Entry::getValue));
}
Run Code Online (Sandbox Code Playgroud)