我有一个ConcurrentHashMap,我从多个线程填充,如下所示:
private static Mapholder = new ConcurrentHashMap (); 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 AtomicLongMapholder = AtomicLongMap.create(); public static void addError(ErrorData error) { holder.getAndIncrement(error); }
如javadoc中所述:
[T]写入此映射的典型机制是addAndGet(K,long),它向当前与K关联的值添加long.如果某个键尚未与值关联,则其隐式值为零.
和
除非另有说明,所有操作均为原子操