从并发Java集合中排除并发活动

时间:2014-11-18 09:47:13

标签: java concurrency effective-java

Joshua Bloch的Effective Java,第二版,第69项,指出

  

[...]提供   高并发性,这些实现在内部管理自己的同步(第67项)。因此,无法排除并发活动   并发收集;锁定它将无效,但会减慢程序。

最后一句话是否正确?如果两个线程锁定集合并在该锁中执行多个操作,这些操作可能仍会交错?

为了使语句正确,我希望这些集合在内部运行您无法同步的线程,或者它们以某种方式"覆盖"标准同步行为使得synchronized(map){ ... }之类的语句与“正常”语句的行为不同。宾语。从答案/评论到相关问题,我认为如果这些都是真的:

为避免可能的误解:

  • 我知道并发集合的设计完全是为了避免这种全局锁定,我的问题是它原则上是否可行
  • 我觉得Effective Java是一本很好的书,我只是想要明确一个特定的项目。

2 个答案:

答案 0 :(得分:2)

Sources建议ConcurrentHashMap使用内部机制进行锁定(static final class [More ...] Segment<K,V> extends ReentrantLock),因此不会对其锁定机制使用任何synchronized方法。

因此,使用Map作为锁定并使用synchronize就可以很简单 - 就像使用new Object()或您自己的ReentrantLock一样。但是,它不会影响Map 的内部运作 - 我认为 - 他想说的是什么。

答案 1 :(得分:0)

这可能会澄清它(暗示另一项67):

  

客户端无法对此类方法执行外部同步,因为无法保证不相关的客户端也会这样做。

您的代码是这些内部同步的并发实现的客户端。即使您使用外部锁定(以减慢自己速度),其他客户端也可能并且仍将同时执行内部实现。