确保所有线程更新 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 { }
块。
我有一个方法被多个线程同时调用。在其中,我正在尝试处理如下代码片段所解释的场景:
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 { }
块。