Question

Is the method ConcurrentHashMap.putAll(Map) supposed to be atomic?

I cannot find it in the documentation and it is not mentioned in the ConcurrentMap interface, so I guess the answer is no. I am asking it to be sure, since it wouldn't make sense if that operation wasn't atomic to be honest.

If it isn't atomic, what would be the best way to support atomic inserts of multiple items? Back to the good old synchronized?

Was it helpful?

Solution

It's not atomic, no. According to the class documentation:

For aggregate operations such as putAll and clear, concurrent retrievals may reflect insertion or removal of only some entries.

To atomicize it, you'll have to use synchronized, yes. There's no non-blocking way to do this.

OTHER TIPS

at the top of the doc

For aggregate operations such as putAll and clear, concurrent retrievals may reflect insertion or removal of only some entries.

putAll() is not atomic, but merely has the guarantee that each individual put() is atomic.

To atomicize it, you'll have to use synchronized, yes

Not only that: you have to put a synchronized block around every public map method thus degrading concurrency.

Licensed under: CC-BY-SA with attribution
Not affiliated with StackOverflow
scroll top