我有一个ConcurrentHashMap,它是从多个线程填充的,如下所示:
private static Map<ErrorData, Long> holder = new ConcurrentHashMap<ErrorData, Long>();
public static void addError(ErrorData error) {
if (holder.keySet().contains(error)) {
holder.put(error, holder.get(error) + 1);
} else {
holder.put(error, 1L);
}
}
上面的代码中是否有可能出现竞争状况,并且可以跳过更新?另外,如果可以提供更好的性能,我如何在这里使用 Guava AtomicLongMap?
我正在使用Java 7。
最佳答案
是的,有可能发生比赛,因为您没有在检查包含和自动放置。
您可以按以下方式使用AtomicLongMap
,它可以自动进行检查:
private static final AtomicLongMap<ErrorData> holder = AtomicLongMap.create();
public static void addError(ErrorData error) {
holder.getAndIncrement(error);
}
如javadoc中所述:
和
关于java - 从多个线程填充 map ,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/34405222/