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

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

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

你在做什么复合操作?

  • 1)您正在检查是否Map包含密钥的向量
  • 2)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()

参考文献: