RFR: 8004518 & 8010122 : Default methods on Map (original) (raw)

Mike Duigou mike.duigou at oracle.com
Thu Apr 11 02:10:31 UTC 2013


On Apr 8 2013, at 14:09 , Peter Levart wrote:

Hi Mike,

It's unfortunate that getOrDefault() is specified so that it can't be implemented atomically in terms of existent (non-default) ConcurrentMap methods, so platform ConcurrentMap implementations will have atomic implementation and others will have to catch-up first. I hope this will not be a cause of any concurrency bugs.

The only solution I can see is to provide a default in ConcurrentMap that uses only get() and documents that implementations supporting null values will will need to override the default. I will include this in the updated webrev.

This may not be as radical as it sounds. Doug has said that he knows of no ConcurrentMap implementations that support null keys/values. (Why would anyone want to)

The javadoc for computeIfPresent seems to be inconsistent:

826 * If the value for the specified key is present and non-null, 827 * attempts to compute a new mapping given the key and its current 828 * mapped value. 829 * 830 *

If the function returns {@code null}, the mapping is removed (or

831 * remains absent if initially absent). If the function itself throws an 832 * (unchecked) exception, the exception is rethrown, and the current mapping 833 * is left unchanged. I think the situation described in bold is non-existent.

Corrected.

Regards, Peter

On 04/08/2013 08:07 PM, Mike Duigou wrote: Hello all;

This is a combined review for the new default methods on the java.util.Map interface being added for the JSR-335 lambda libraries. The reviews are being combined because they share a common unit test. http://cr.openjdk.java.net/~mduigou/JDK-8010122/0/webrev/ 8004518: Add in-place operations to Map forEach() replaceAll() 8010122: Add atomic operations to Map getOrDefault() putIfAbsent() * remove(K, V) replace(K, V) replace(K, V, V) compute() * merge() * computeIfAbsent() * computeIfPresent() * The * operations treat null values as being absent. (ie. the same as there being no mapping for the specified key). The default implementations provided in Map are overridden in HashMap for performance purposes, in Hashtable for atomicity and performance purposes and in Collections for atomicity. Mike



More information about the core-libs-dev mailing list