gpt4 book ai didi

java - 从多个线程填充 map

转载 作者:行者123 更新时间:2023-11-29 09:35:26 25 4
gpt4 key购买 nike

我有一个从多个线程填充的 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 中所述:

[T]he typical mechanism for writing to this map is addAndGet(K, long), which adds a long to the value currently associated with K. If a key has not yet been associated with a value, its implicit value is zero.

All operations are atomic unless otherwise noted.

关于java - 从多个线程填充 map ,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34405222/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com