Question about atomicity in ConcurrentHashMap

Brian Goetz brian.goetz at oracle.com
Thu May 23 08:33:52 PDT 2013


This is subtle.

Just as everything else about Map does not make any promises about 
thread-safety or atomicity, computeIfAbsent in Map does not either. 
However, when used in a thread-confined manner, just like anything else 
about a non-thread-safe Map, it still useful and sensible and well-defined.

Just as ConcurrentMap adds additional thread-safety semantics to the 
methods of Map, it adds atomicity to computeIfAbsent.  It is allowable 
for an interface like ConcurrentMap to be stronger than a superinterface 
like Map.

As it turns out, the defaults in Map are carefully written so as to only 
depend on methods that are atomic in ConcurrentMap, so magically when 
inherited by a ConcurrentMap, they are atomic.

On 5/23/2013 11:00 AM, Gernot Neppert wrote:
> Hi,
>
> while testing build 90 of JDK 1.8.0, I was pleased to see that dearly
> missed methods such as 'computeIfAbsent' have now been included in
> interface Map!
>
> However, in the past, whenever I needed such a method, it would have had to
> be atomic in order to be useful.
>
> The JavaDoc of java.util.Map.computeIfAbsent clearly states:
>
> "Any implementation providing atomicity guarantees must override this
> method and document its concurrency properties."
>
> So I'm wondering: Why does ConcurrentHashMap not implement those methods in
> an atomic way?
>


More information about the lambda-dev mailing list