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);
}
}
}
}
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)
size()
method reporting the wrong value.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.