【发布时间】:2016-12-14 06:17:03
【问题描述】:
我有一个ConcurrentMap,我需要从多线程应用程序中填充它。我的地图如下所示:
private final ConcurrentMap<String, AtomicLongMap<String>> deviceErrorHolder = Maps.newConcurrentMap();
下面是我的方法,它以非常快的速度从多线程应用程序调用,所以我需要确保它很快。
public void addDeviceErrorStats(String deviceName, String errorName) {
AtomicLongMap<String> errorMap = deviceErrorHolder.get(deviceName);
if (errorMap == null) {
errorMap = AtomicLongMap.create();
AtomicLongMap<String> currenttErrorMap = deviceErrorHolder.putIfAbsent(deviceName, errorMap);
if (currenttErrorMap != null) {
errorMap = currenttErrorMap;
}
}
errorMap.incrementAndGet(errorName);
}
对于每个deviceName,我将有一个AtomicLongMap,其中将包含不同errorName 的所有计数。
ExceptionCounter.getInstance().addDeviceErrorStats("deviceA", "errorA");
ExceptionCounter.getInstance().addDeviceErrorStats("deviceA", "errorB");
ExceptionCounter.getInstance().addDeviceErrorStats("deviceA", "errorC");
ExceptionCounter.getInstance().addDeviceErrorStats("deviceB", "errorA");
ExceptionCounter.getInstance().addDeviceErrorStats("deviceB", "errorB");
我的addDeviceErrorStats 方法线程安全吗?还有我更新deviceErrorHolder 地图值的方式是否正确?这意味着它将是一个原子操作吗?我需要同步创建新的AtomicLongMap 实例吗?还是CM会替我处理?
我正在使用 Java7。
【问题讨论】:
-
你为什么不写一些测试用例来生成你的场景并分享结果:D
-
您需要 computeIfAbsent 才能使其线程安全。
-
我还在使用 Java 7,所以不能使用
computeIfAbsent -
@PeterLawrey 那我的代码有问题吗?而且它不是线程安全的?
-
@user5447339 computeIfAbsent 将是一个单行,而 currentErrorMap 是最新创建的。
标签: java multithreading thread-safety concurrenthashmap atomic