确保所有线程更新 Java 中映射中的单个条目

Ensure all threads updating a single entry in a map in Java

我有一个方法被多个线程同时调用。在其中,我正在尝试处理如下代码片段所解释的场景:

Map<Object,Long> syncMap = Collections.synchronizedMap(normalHashMap);

Runnable mapOperations = () -> {
    synchronized (syncMap) {
        if (MapUtils.isNotEmpty(syncMap))
        {
            Object currentCount = syncMap.get(entryKey);

            // Every thread should execute this once. Every thread brings a value and that gets added up and stored for this "key"
            syncMap.put(key, value + valueFromThisThread);
        }
    }
};
mapOperations.run();

每个线程都应该执行一次上面的块。每个线程都带来一个 long 值,然后将其加起来并存储在地图中的这个“关键”条目中。

有人可以确认这是否可行吗?

您的代码应该可以正常工作。此外,如果您想确保不在 CPU 缓存中缓存该字段,您可能希望将其定义为 volatile,例如:

volatile Map<Object,Long> syncMap = Collections.synchronizedMap(normalHashMap);

此外,如果您使用 SynchronizedMap,则不需要 synchronized { } 块。