Hi, Paul

On 3/10/15 8:29 AM, Paul Sandoz wrote:

On the Map.compute* methods.

Perhaps we can reuse similar language to that we added for Matcher:

* The mapping function should not modify this map during computation.
* This method will, on a best-effort basis, throw a
* ConcurrentModification if such modification is detected.

It's tempting to place the second sentence on the @throws
ConcurrentModificationException as i believe will not show up for
methods on ConcurrentMap, so keeps it somewhat contained
documentation wise.

The language in Matcher is nice, and we can use it in HashMap. But the default code in Map.compute* won't throw a CME (no iteration). For the compute* methods in the Map interface, I think we should stick to recommending against modifying the Map during the computation, and encouraging implementing classes to check for CME.

In Map/HashMap, there are already two methods that accept lambdas
and throw a CME: forEach(BiConsumer) replaceAll(BiFunction)

(The default code does not throw a CME ifitems are added).

Right, although the iterator might still be fail-fast.

Ahh - I needed to update my test code (if a Map only has a single entry, the iterator doesn't CME when items are added because a second "iteration" never happens to detect the changed modCount). A Map with >= 2 entries is needed for the default code to CME due to items being added during forEach()/replaceAll().

Thanks,
-Brent

Reply via email to