当前位置:  开发笔记 > 编程语言 > 正文

从多个线程填充地图

如何解决《从多个线程填充地图》经验,为你挑选了1个好方法。

我有一个ConcurrentHashMap,我从多个线程填充,如下所示:

private static Map holder = 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上.



1> Andy Turner..:

是的,因为你没有检查包含和原子化,所以有可能发生竞争.

你可以使用AtomicLongMap如下,它以原子方式检查:

private static final AtomicLongMap holder = AtomicLongMap.create();

public static void addError(ErrorData error) {
  holder.getAndIncrement(error);
}

如javadoc中所述:

[T]写入此映射的典型机制是addAndGet(K,long),它向当前与K关联的值添加long.如果某个键尚未与值关联,则其隐式值为零.

除非另有说明,所有操作均为原子操

推荐阅读
k78283381
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有