Joshua Bloch的Effective Java,第二版,第69项,指出
[...]提供 高并发性,这些实现在内部管理自己的同步(第67项)。因此,无法排除并发活动 并发收集;锁定它将无效,但会减慢程序。
最后一句话是否正确?如果两个线程锁定集合并在该锁中执行多个操作,这些操作可能仍会交错?
为了使语句正确,我希望这些集合在内部运行您无法同步的线程,或者它们以某种方式"覆盖"标准同步行为使得synchronized(map){ ... }
之类的语句与“正常”语句的行为不同。宾语。从答案/评论到相关问题,我认为如果这些都是真的:
为避免可能的误解:
答案 0 :(得分:2)
Sources建议ConcurrentHashMap
使用内部机制进行锁定(static final class [More ...] Segment<K,V> extends ReentrantLock
),因此不会对其锁定机制使用任何synchronized
方法。
因此,使用Map
作为锁定并使用synchronize
就可以很简单 - 就像使用new Object()
或您自己的ReentrantLock
一样。但是,它不会影响Map
的内部运作 - 我认为 - 他想说的是什么。
答案 1 :(得分:0)
这可能会澄清它(暗示另一项67):
客户端无法对此类方法执行外部同步,因为无法保证不相关的客户端也会这样做。
您的代码是这些内部同步的并发实现的客户端。即使您使用外部锁定(以减慢自己速度),其他客户端也可能并且仍将同时执行内部实现。