可以在 HashMap 中获取、放置和删除元素而不进行迭代导致 ConcurrentModificationException 吗?

Ant*_*y C 3 java hashmap concurrentmodification

我有一个静态 hashMap,与多个线程共享。我根本没有迭代地图,只是使用get, put, remove。安全吗ConcurrentModificationException

该方法看起来像这样

private static Map<Long, Integer> TRACKER = new HashMap<Long,Integer>();
public static void track(Long tid, boolean b) {
        if (b) {
            if (TRACKER.containsKey(tid)) {
                TRACKER.put(tid, TRACKER.get(tid) + 1);
            } else {
                TRACKER.put(tid, 1);
            }
        } else {
            Integer n = TRACKER.get(tid);
            if (n != null) {
                n = n -1;
                if (n == 0) {
                    TRACKER.remove(tid);
                } else {
                    TRACKER.put(tid, n);
                }
            }
        }
    }
Run Code Online (Sandbox Code Playgroud)

Sak*_*ari 5

如果多个线程在 a 上执行get, put&操作,而没有适当的同步,则可能会发生一些不好的事情,例如 size() 报告丢失/丢失的条目、意外的 NPE……甚至可能会发生无限循环。removeHashMap

HashMap文档说 -

请注意,此实现不是同步的。如果多个线程同时访问哈希图,并且至少有一个线程在结构上修改了该图,则必须进行外部同步。(结构修改是添加或删除一个或多个映射的任何操作;仅更改与实例已包含的键关联的值不是结构修改。)...

谢谢斯蒂芬。