java - 添加到 ConcurrentHashMap 中的 AtomicInteger

标签 java multithreading concurrency java.util.concurrent concurrenthashmap

我定义了以下内容

private ConcurrentMap<Integer, AtomicInteger>  = new ConcurrentHashMap<Integer, AtomicInteger>();

private void add() {
  staffValues.replace(100, staffValues.get(100), new AtomicInteger(staffValues.get(100).addAndGet(200)));
}

经过测试,我得到的值不是预期的,我认为这里存在竞争条件。有谁知道通过将 get 调用包装在替换函数中是否会被认为是线程安全的?

最佳答案

处理此类情况的一个好方法是使用 computeIfAbsent方法(不是@the8472推荐的compute方法)

computeIfAbsent 接受 2 个参数、键和 Function<K, V>仅当现有值丢失时才会被调用。由于 AtomicInteger 是线程安全的,可以从多个线程递增,因此您可以通过以下方式轻松使用它:

staffValues.computeIfAbsent(100, k -> new AtomicInteger(0)).addAndGet(200);

关于java - 添加到 ConcurrentHashMap 中的 AtomicInteger,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40821040/

相关文章:

java - 在 Tomcat 服务器中部署 WAR 文件时出错 - org.springframework.web.context.ContextLoaderListener 未加载

java - 查询集合交集

java - Spring AOP : Annotation pointcut not causing advice to execute

java - 服务器套接字中的线程和处理程序

java - 多线程|| java

java - Android SDK logcat 是否按照创建自定义 Log.d() 消息的顺序显示它们?

JavaFX 2 : background and Platform. runLater vs 任务/服务

Golang并发,批量处理元素

java - ReentrantReadWriteLock 阻止我对对象进行操作?

.net - ThreadPool.QueueUserWorkItem 完成事件?