javahashmapconcurrentmodification

Can get, put & remove element in HashMap without iteration cause ConcurrentModificationException?


I have a static hashMap, shared with multiple threads. I am not iterating the map at all but just uses the get, put, remove. Is it safe from ConcurrentModificationException ?

The method looks like this

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);
                }
            }
        }
    }

Solution

  • Is it safe from ConcurrentModificationException?

    It is safe from ConcurrentModificationException. That exception is only thrown by methods that iterate (in some sense) the map or one of its views using a conventional iterator or a spliterator.

    However, since HashMap is not a thread-safe class, if you use it from multiple threads without proper external external synchronization, bad things can happen. These include (in order of increasing badness)

    1. The size() method reporting the wrong value.
    2. Entries mysteriously disappearing, either temporarily or permanently.
    3. Possible NPEs and other unchecked exceptions.
    4. Possible infinite loops due to an unfortunate sequence of operations by multiple threads creating a loop in a hash chain.

    Your example code is unsafe ... but you won't get a "fast fail" ConcurrentModificationException. Instead you are likely to get inexplicable errors at "random" times that are difficult to reproduce.