RFC: Adding ConcurrentModificationException for HashMap.computeIfAbsent(), and JDK-8071667

Brent Christian brent.christian at oracle.com
Wed Feb 4 00:01:51 UTC 2015


Hi,

The code in bug 8071667 [1] passes a mappingFunction to 
computeIfAbsent() which itself put()s a sufficient number of additional 
entries into the HashMap to cause a resize/rehash.  As a result, 
computeIfAbsent() doesn't add the new entry at the proper place in the 
HashMap.

While one should not (mis)use the mappingFunction in this way, 
HashMap.computeIfAbsent() (and similar HashMap methods which accept 
Lambda expressions) could check for and throw a 
ConcurrentModificationException on a "best-effort" basis, similar to 
iterators.  This is already done in bulk operations HashMap.forEach() 
and HashMap.replaceAll().

I think it's also worth making mention of this in the JavaDoc.

Here's an example of what might be done, using computeIfAbsent() as an 
example:

http://cr.openjdk.java.net/~bchristi/8071667/webrev.0/

I would update HashMap and Hashtable.  It looks like 
ConcurrentHashMap.computeIfAbsent() already forbids such usage, stating 
that the computation "must not attempt to update any other mappings of 
this map."


Comments on this approach?

Thanks,
-Brent

1. https://bugs.openjdk.java.net/browse/JDK-8071667
    "HashMap.computeIfAbsent() adds entry that HashMap.get() does not find."



More information about the core-libs-dev mailing list