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

从并发Java集合中排除并发活动,java,concurrency,effective-java,Java,Concurrency,Effective Java,约书亚·布洛赫(Joshua Bloch)的《有效Java》,第二版,第69项指出 [……]提供 高并发性,这些实现在内部管理自己的同步(第67项)。因此,不可能从中排除并发活动 同时收集;锁定它不会产生任何效果,但会减慢程序的速度 这最后一句话正确吗?如果两个线程锁定集合并在该锁内执行多个操作,这些操作可能仍然是交错的 为了使语句正确,我希望这些集合在内部运行线程,而您无法与之同步,或者它们以某种方式“覆盖”标准同步行为,使得像synchronized(map){…}这样的语句的行为不同于“普

约书亚·布洛赫(Joshua Bloch)的《有效Java》,第二版,第69项指出

[……]提供 高并发性,这些实现在内部管理自己的同步(第67项)。因此,不可能从中排除并发活动 同时收集;锁定它不会产生任何效果,但会减慢程序的速度

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

为了使语句正确,我希望这些集合在内部运行线程,而您无法与之同步,或者它们以某种方式“覆盖”标准同步行为,使得像
synchronized(map){…}
这样的语句的行为不同于“普通”对象。从对相关问题的回答/评论来看,我认为这两个问题都不是真的:

为避免可能的误解:

  • 我知道并发集合的设计正是为了避免这种全局锁定,我的问题是原则上是否可能
  • 我发现《有效的Java》是一本优秀的书,我只是想澄清一个特定的问题
建议
ConcurrentHashMap
使用内部锁定机制(
静态最终类[更多…]段扩展ReentrantLock
),因此不使用任何
同步的
方法来锁定机制

因此,使用
映射
作为锁并在其上进行
同步
应该很简单-就像您可以使用
新对象()
或您自己的
重入锁定
一样。然而,这不会影响
地图的内部工作,我想这是他想说的。

这可能会澄清它(来自另一项67的提示):

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


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

谢谢您的回答。可能作者实际上基本上是指,如果您不控制对该集合的所有访问点,则不可能从并发集合中排除并发活动。