RFR: 8004518 & 8010122 : Default methods on Map

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      * <p>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