ConcurrentHashMap在哪里获取方法锁定?

时间:2016-07-14 23:51:21

标签: java concurrenthashmap

我阅读了Brian Goetz关于ConcurrentHashMap的this优秀文章。但是当我在最近的java版本(1.8)中查看ConcurrentHashMap的代码时,我注意到了一些差异

  1. MapEntry中的下一个指针不是final,而是volatile,因此可以在中间修改列表,而不仅仅是开始。

    static class Node<K,V> implements Map.Entry<K,V> {
        final int hash;
        final K key;
        volatile V val;
        volatile Node<K,V> next;
    
  2. 此外,在初始迭代中无法查找密钥时,我也看不到get方法在哪里获取锁定

    public V get(Object key) {
    Node<K,V>[] tab; Node<K,V> e, p; int n, eh; K ek;
    int h = spread(key.hashCode());
    if ((tab = table) != null && (n = tab.length) > 0 &&
        (e = tabAt(tab, (n - 1) & h)) != null) {
        if ((eh = e.hash) == h) {
            if ((ek = e.key) == key || (ek != null && key.equals(ek)))
                return e.val;
        }
        else if (eh < 0)
            return (p = e.find(h, key)) != null ? p.val : null;
        while ((e = e.next) != null) {
            if (e.hash == h &&
                ((ek = e.key) == key || (ek != null && key.equals(ek))))
                return e.val;
        }
    }
    return null;
    

    }

  3. 有人可以解释一下get方法中获取锁的方式和位置,如果有的话?

0 个答案:

没有答案