简体   繁体   中英

Is “ConcurrentHashMap.putAll(…)” atomic?

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?

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.

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.

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.

putAll()不是原子的,而只是保证每个put()都是原子的。

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM