繁体   English   中英

ConcurrentHashMap每次读取都锁定?

[英]ConcurrentHashMap Locking at every read?

我想了解锁定在Java ConcurrentHashMap中是如何工作的。 根据此处的源代码,看起来对于每次读取,它都使用该特定段的锁来锁定读取器。 我看错了吗?

V readValueUnderLock(HashEntry<K,V> e) {
    lock();
         try {
             return e.value;
         } finally {
             unlock();
         }
     }

每次读取均未锁定,下面是方法readValueUnderLock的文档

读取处于锁定状态的条目的值字段。 如果value字段曾经显示为null,则调用此方法 仅当编译器碰巧使用表分配对HashEntry初始化进行重新排序时才有可能,这在内存模型下合法的,但从未发生过

读入ConcurrentHashMap不会在整个地图上同步。 除了一种情况外,事实遍历根本不同步。 内部LinkedList实现知道对基础集合的更改。 如果在遍历期间检测到任何此类更改,它将在正在遍历的存储桶中进行自身同步,然后尝试重新读取值。 这始终可以确保尽管接收到的值始终是最新的,但存在最小锁定(如果有)。

下面是此类的get实现,仅当v为null时才调用readValueUnderLock

V get(Object key, int hash) {
    if (count != 0) { // read-volatile
        HashEntry<K,V> e = getFirst(hash);
        while (e != null) {
            if (e.hash == hash && key.equals(e.key)) {
                V v = e.value;
                if (v != null)
                    return v;
                return readValueUnderLock(e); // recheck
            }
            e = e.next;
        }
    }
    return null;
}

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM