【问题标题】:Why ConcurrentHashMap cannot be locked for exclusive access?为什么不能锁定 ConcurrentHashMap 以进行独占访问?
【发布时间】:2013-07-27 09:51:53
【问题描述】:

来自#JCIP 的引用:

“由于 ConcurrentHashMap 不能被锁定为独占访问,我们 不能使用客户端锁定来创建新的原子操作,例如 put-if-absent,就像我们对 Vector 所做的那样

为什么我们不能仅仅获取 来实现额外的原子方法并保持集合线程安全(如同步Collections.synchronizedxxx 工厂返回的集合):

【问题讨论】:

  • 因为它是并发的。

标签: java collections concurrency concurrenthashmap


【解决方案1】:

为什么?因为实现不支持它。 Straight from the ConcurrentHashMap JavaDocs:

支持以阻止所有访问的方式锁定整个表

...顾名思义,就是“独占访问”。

【讨论】:

    【解决方案2】:

    ConcurrentHashMap 的重点是读取操作永远不会阻塞,即不必检查锁。这排除了拥有这种锁的能力。

    为什么我们不能只获取锁:

    您可以这样做,但您必须对地图的所有访问路径始终如一地这样做,然后您就完全否定了并发数据结构的目的。它应该是无锁的。

    【讨论】:

      【解决方案3】:

      您编写的代码就是您的实现,如果您以这种方式使用它,那么所有其他操作都必须以这种方式工作,即所有操作都必须获取相同的锁。

      但这里的重点是java并没有为此提供ConcurrentHashMap,其目的是让多个线程同时工作。

      根据您的要求,请转到HashTable

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2012-01-30
        • 1970-01-01
        • 2020-10-17
        • 2013-07-14
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多