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

Reply via email to