Joshua Bloch的Effective
Java,第二版,第69项,指出
[…] To provide
high concurrency, these implementations manage their own synchronization internally (Item 67). Therefore, it is impossible to exclude concurrent activity from
a concurrent collection; locking it will have no effect but to slow the program.
这最后的陈述是否正确?如果两个线程锁定集合并在该锁中执行多个操作,这些操作可能仍然是交错的?
为了使语句正确,我希望这些集合在内部运行您无法同步的线程,或者它们以某种方式“覆盖”标准同步行为,使得像synchronized(map){…}这样的语句行为不同于一个’正常’的对象.从答案/评论到相关问题,我认为如果这些都是真的:
> Exclusively Locking ConcurrentHashMap
> ConcurrentHashMap and compound operations
为了避免可能的误解:
>我知道并发集合的设计完全是为了避免这种全局锁定,我的问题是它原则上是否可行
>我发现Effective Java是一本很好的书,我只是想要明确一个特定的项目.
最佳答案
Sources建议ConcurrentHashMap使用内部机制进行锁定(静态最终类[更多…]段< K,V>扩展ReentrantLock),因此不会对其锁定机制使用任何同步方法.
因此,使用Map作为锁并在其上进行同步应该很简单 – 就像使用新的Object()或您自己的ReentrantLock一样.但是,它不会影响地图的内部运作 – 我认为 – 他想说的是什么.