【问题标题】:What is the meaning of the sentence- [ a ConcurrentHashMap cannot be locked for exclusive access]? [duplicate]这句话的含义是什么 - [不能锁定 ConcurrentHashMap 以进行独占访问]? [复制]
【发布时间】:2016-10-03 12:03:49
【问题描述】:

Joshua Block 和著名的 Java Concurrentcy In Practice 的合著者提出-

这来自第 5 章构建模块-

...由于 ConcurrentHashMap 无法独占锁定 访问.....

我的理解是独占访问是指锁定整个集合,每个线程在操作期间持有一个锁,以使它们成为原子的。

    ConcurrentHashMap< String, String> map = new ConcurrentHashMap< String, String>();

    public void getExclusiveAccess(){
        synchronized (map) {
            //....
        }
    }

尽管这样做很愚蠢,但显然可以通过同样的方式实现独占访问。
请提出建议。
为什么作者说不能锁定 ConcurrentHashMap 以进行独占访问

【问题讨论】:

    标签: java


    【解决方案1】:

    我已经做到了,但它是可以实现的,但它只适用于这种外部锁定,ConcurrentMap 不支持。如果您在不使用此同步的情况下在任何地方访问地图,则它不会是独占的。如果你在任何地方都使用同步,它就不再是并发的了。

    这可能有意义的唯一情况是您需要独占写入而不是独占读取。

    【讨论】:

    • 这显然是客户端锁定。那么为什么作者提到——由于不能锁定 ConcurrentHashMap 以进行独占访问,我们不能使用客户端锁定来创建新的原子操作,例如 put-if-absent, 我知道已经有并发映射中的原子操作来做同样的事情。
    • @ShirgillFarhanAnsari ConcurrentMap 不支持此功能,这不会阻止您实施自己的解决方案,但您不会从实施中获得任何支持。
    • 我认为这个示例代码将有助于:ideone.com/N6tIRI,了解彼得/本书作者想要传达的内容。
    【解决方案2】:

    显然可以通过相同的方式实现独占访问

    如果其他代码在同步块之外使用地图(这是完全可以接受的),则不会。

    这与 synchronizedMap 不同,其中所有方法都在地图本身上同步 - 因此,如果您在这样的地图上 synchronized(map) {... },您实际上拥有独占访问权限。

    【讨论】:

    • 但我只考虑我显然拥有独占访问权的情况。 synchronized (map) { //.... } 甚至保证对这种情况的独占访问权。
    • @ShirgillFarhanAnsari CHM 实现本身不支持独占访问。当然,现在您始终可以通过使用客户端锁定来强制执行独占访问......但这与在实现级别提供独占访问的Collections.synchronizedMap() 非常不同。
    猜你喜欢
    • 2013-07-27
    • 1970-01-01
    • 2012-01-30
    • 1970-01-01
    • 2020-10-17
    • 2013-07-14
    • 2011-05-05
    • 1970-01-01
    • 2019-09-07
    相关资源
    最近更新 更多