Mur*_*ali 9 java findbugs concurrenthashmap java.util.concurrent
嗨我得到的错误"调用java.util.concurrent.ConcurrentHashMap的序列可能不是原子的"当我在我的项目中运行find bug时,代码如下.
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);
}
}
Run Code Online (Sandbox Code Playgroud)
我在线下的personTypeMap.put(personTypeCollection.getGroupId(),personTypeCollection)面临问题;
任何人都可以帮我解决问题.
Nar*_*hai 12
你在做什么复合操作?
Map包含密钥的向量Vector如果没有找到任何值,您将放置一个新的所以这是一个两步动作并且是复合的,所以它是不安全的.
他们为什么不安全?
因为它们不是原子的.想想你有两个线程的场景.
考虑这个时间表:
Thread 1 --- checks for == null -> true puts a new Vector
Thread 2 --- checks for ==null -> true puts a new Vector
Run Code Online (Sandbox Code Playgroud)
使用putIfAbsent()方法on ConcurrentHashMap,它为您尝试执行的操作提供原子解决方案.
ConcurrentHashMap的#的putIfAbsent()
参考文献: