我一直认为ConcurrentHashMap
和类似的类(维护同步更新并且不同步读取)做了非常有用和直观的事情:它们没有锁定读取并锁定更新的所有功能。像这样的策略确保所有事情保持一致。
但是我仔细阅读了文档,并打开了ConcurrentHashMap
的实现,正如我现在所理解的,当另一个线程正在执行更新时,它不会阻止读取。如果一个线程开始执行putAll(hugeCollection)
而另一个线程同时重复contains(theSameObjectForAllCalls)
,那么当putAll
仍在工作时,第二个线程可能会得到不同的结果。
以下是文档中的相关部分:
对于诸如的聚合操作 putAll and clear,concurrent 检索可能反映插入或 只删除一些条目。
另一个有趣的事情是:
检索反映了结果 最近完成的更新 在他们开始时坚持的行动。
这不是因为某些锁定,而是因为首先添加了一个新对象,并且只有在该对象计数器递增并且该对象变为可见以进行读取操作之后。
那么,锁定更新的重点是什么?
答案 0 :(得分:4)
Brian Goetz在开发人员的工作中解释了article的工作。这应该会有所帮助。
答案 1 :(得分:4)
这些类使您可以进一步控制并发性与一致性之间的权衡。如果您真正想要的是拥有原子的,一致的读取,那么请为自己创建一个同步的hashmap。但是,如果您需要更多的并发性,您可以获得ConcurrentHashMap,只要您知道读取将获得地图在某些时候的外观的准确图片,而不一定是现在。
权衡是你必须更加思考数据的一致性,但你的应用程序可以有更大的并发性。