我有一个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/

10-13 01:16