从并发Java集合中排除并发活动
约书亚·布洛赫(Joshua Bloch)的《有效Java》,第二版,第69项指出 [……]提供 高并发性,这些实现在内部管理自己的同步(第67项)。因此,不可能从中排除并发活动 同时收集;锁定它不会产生任何效果,但会减慢程序的速度 这最后一句话正确吗?如果两个线程锁定集合并在该锁内执行多个操作,这些操作可能仍然是交错的 为了使语句正确,我希望这些集合在内部运行线程,而您无法与之同步,或者它们以某种方式“覆盖”标准同步行为,使得像从并发Java集合中排除并发活动,java,concurrency,effective-java,Java,Concurrency,Effective Java,约书亚·布洛赫(Joshua Bloch)的《有效Java》,第二版,第69项指出 [……]提供 高并发性,这些实现在内部管理自己的同步(第67项)。因此,不可能从中排除并发活动 同时收集;锁定它不会产生任何效果,但会减慢程序的速度 这最后一句话正确吗?如果两个线程锁定集合并在该锁内执行多个操作,这些操作可能仍然是交错的 为了使语句正确,我希望这些集合在内部运行线程,而您无法与之同步,或者它们以某种方式“覆盖”标准同步行为,使得像synchronized(map){…}这样的语句的行为不同于“普
synchronized(map){…}
这样的语句的行为不同于“普通”对象。从对相关问题的回答/评论来看,我认为这两个问题都不是真的:
- 我知道并发集合的设计正是为了避免这种全局锁定,我的问题是原则上是否可能
- 我发现《有效的Java》是一本优秀的书,我只是想澄清一个特定的问题
ConcurrentHashMap
使用内部锁定机制(静态最终类[更多…]段扩展ReentrantLock
),因此不使用任何同步的
方法来锁定机制
因此,使用映射
作为锁并在其上进行同步
应该很简单-就像您可以使用新对象()
或您自己的重入锁定
一样。然而,这不会影响地图的内部工作,我想这是他想说的。这可能会澄清它(来自另一项67的提示):
客户端不可能对这样的方法执行外部同步,因为不能保证不相关的客户端也会这样做
您的代码是这些内部同步并发实现的客户端。即使您使用外部锁(降低自己的速度),其他客户端也可能不会并且仍然会同时执行内部实现。谢谢您的回答。可能作者实际上基本上是指,如果您不控制对该集合的所有访问点,则不可能从并发集合中排除并发活动。