java - Java8:ConcurrentHashMap.compute 原子性
问题描述
我正在尝试使用 ConcurrentHashMap.compute 来实现某些东西,但我无法确定我的逻辑是否 100% 线程安全且正确。Javadoc 说关于compute(K key, BiFunction<? super K, ? super V, ? extends V> remappingFunction)
方法:
尝试计算指定键及其当前映射值的映射(如果没有当前映射,则为 null)。整个方法调用以原子方式执行。在计算过程中,其他线程对这个映射的一些尝试更新操作可能会被阻塞,因此计算应该简短而简单,并且不能尝试更新这个映射的任何其他映射。
问题是:我可以将具有副作用的函数传递给此方法吗?即使有其他线程试图更新同一个键,是否可以保证该函数只应用一次?
LE:根据要求,这是我的更新功能(尝试生成事件并从地图中删除缓存的更新):
final Set<UniqueID> updatedIds = new HashSet<>(updatesMap.keySet());
for (final ID id : updatedIds) {
updatesMap.compute(id, (modifiedId, updates) -> {
final Event event = createEvent(modifiedId, updates);
threadPool.addEvent(event);
return null;
});
}
我必须确保每个 updatedId 只创建一个事件。
解决方案
推荐阅读
- forms - 渲染 Flutter TextFormBloc 不渲染的问题
- c - 如何制作一个完整弧线的视野?尝试创建射线弧
- dart - 为什么我不能在 Dart 2 中使用泛型类型作为参数?
- reactjs - 无法将 mapStateToProps 连接到 React 组件
- c# - 如何检查带有空格的字符串没有数字?
- c++11 - 如何使用仅连接一次的多线程从 Internet 读取数据?
- r - 如何从多个条件和嵌套加权平均值创建新变量
- linux - 重启后无法登录虚拟机
- mysql - 什么索引可以确保该查询快速运行?
- tensorflow - tf.keras 替换预训练 resnet50 中的较低层