首页 > 解决方案 > 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 只创建一个事件。

标签: javaconcurrencyjava-8

解决方案


推荐阅读