gpt4 book ai didi

java - 如何解决对 java.util.concurrent.ConcurrentHashMap 的 findbug 调用序列可能不是原子的

转载 作者:塔克拉玛干 更新时间:2023-11-03 03:11:58 25 4
gpt4 key购买 nike

您好,当我在我的项目中针对以下代码运行查找错误时,遇到错误“对 java.util.concurrent.ConcurrentHashMap 的调用序列可能不是原子的”。

public static final ConcurrentHashMap<String,Vector<Person>> personTypeMap = new ConcurrentHashMap<String, Vector<Person>>();

private static void setDefaultPersonGroup() {


PersonDao crud = PersonDao.getInstance();
List<Person> personDBList = crud.retrieveAll();
for (Person person : personDBList) {
Vector<Person> personTypeCollection = personTypeMap.get(person
.getGroupId());
if (personTypeCollection == null) {
personTypeCollection = new Vector<Person>();
personTypeMap.put(personTypeCollection.getGroupId(),
personTypeCollection);
}
personTypeCollection.add(person);
}
}

我在线上遇到的问题personTypeMap.put(personTypeCollection.getGroupId(), personTypeCollection);

谁能帮我解决这个问题。

最佳答案

复合操作在并发环境中是不安全的。

你在执行什么复合操作?

  • 1) 您正在检查 Map 是否包含一个键 vector
  • 2) 如果没有找到值,你将放置一个新的Vector

所以这是一个两步操作并且是复合的,所以它是不安全的。

为什么它们不安全?

因为它们不是原子的。想一想您有两个线程的场景。

考虑这个时间轴:

Thread 1 --- checks for == null -> true                                           puts a new Vector

Thread 2 --- checks for ==null -> true puts a new Vector

ConcurrentHashMap 上使用 putIfAbsent() 方法,它为您尝试执行的操作提供原子解决方案。

ConcurrentHashMap#putIfAbsent()

引用资料:

关于java - 如何解决对 java.util.concurrent.ConcurrentHashMap 的 findbug 调用序列可能不是原子的,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21251134/

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