use*_*349 1 java multithreading concurrenthashmap guava
我有一个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);
}
}
Run Code Online (Sandbox Code Playgroud)
上面的代码是否存在竞争条件的可能性,它可以跳过更新?如果可以提供更好的性能,我怎么能在这里使用Guava AtomicLongMap?
我在Java 7上.
是的,因为你没有检查包含和原子化,所以有可能发生竞争.
你可以使用AtomicLongMap如下,它以原子方式检查:
private static final AtomicLongMap<ErrorData> holder = AtomicLongMap.create();
public static void addError(ErrorData error) {
holder.getAndIncrement(error);
}
Run Code Online (Sandbox Code Playgroud)
如javadoc中所述:
[T]写入此映射的典型机制是addAndGet(K,long),它向当前与K关联的值添加long.如果某个键尚未与值关联,则其隐式值为零.
和
除非另有说明,所有操作均为原子操
| 归档时间: |
|
| 查看次数: |
130 次 |
| 最近记录: |