为什么readValueUnderLock(e)存在于ConcurrentHashMap的get方法中?

时间:2017-01-07 03:26:16

标签: java concurrenthashmap

当我在ConcurrentHashMap阅读JDK1.6的源代码时,我发现无法访问readValueUnderLock(e),因为put方法已检查了值:if value是null,它必须抛出NullPointerException。所以我认为可能有问题,但我不确定它是什么。如果有人能回答我,我将不胜感激!

这里有一些源代码:

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;
}

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

public V put(K key, V value) {
    if (value == null)
        throw new NullPointerException();
    int hash = hash(key.hashCode());
    return segmentFor(hash).put(key, hash, value, false);
}

1 个答案:

答案 0 :(得分:1)

V只是Entry.value的快照。 Entry可能尚未完全构建(考虑先前Java内存模型中的双重检查锁定问题),它可能为null。虽然这只是一个极端的边缘情况,但JRE必须确保其有效,因此有readValueUnderLock

PS:最好跟上时间。 Java正在发展,Java 9将在几个月内推出。它的代码库发生了一些巨大的变化。用过时的知识填补你的头脑可能不是一个好主意。