美文网首页
Entry(hashmap)和hashEntry(Concurr

Entry(hashmap)和hashEntry(Concurr

作者: 凉风拂面秋挽月 | 来源:发表于2020-03-02 21:46 被阅读0次

    hashMap中的主要构成即为数组+链表,数组元素即为链表的头结点,数组元素类型为继承Map.Entry<K,V>的node,可以发现node属性未被volatile修饰,不能保证并发条件下的内存可见性。

     static class Node<K,V> implements Map.Entry<K,V> {
            final int hash;
            final K key;
            V value;
            Node<K,V> next;
    
            Node(int hash, K key, V value, Node<K,V> next) {
                this.hash = hash;
                this.key = key;
                this.value = value;
                this.next = next;
            }
    
            public final K getKey()        { return key; }
            public final V getValue()      { return value; }
            public final String toString() { return key + "=" + value; }
    
            public final int hashCode() {
                return Objects.hashCode(key) ^ Objects.hashCode(value);
            }
    
            public final V setValue(V newValue) {
                V oldValue = value;
                value = newValue;
                return oldValue;
            }
    
            public final boolean equals(Object o) {
                if (o == this)
                    return true;
                if (o instanceof Map.Entry) {
                    Map.Entry<?,?> e = (Map.Entry<?,?>)o;
                    if (Objects.equals(key, e.getKey()) &&
                        Objects.equals(value, e.getValue()))
                        return true;
                }
                return false;
            }
        }
    

    hashEntry是ConcurrentHashMap中数组的元素类型,一个segment等同于hashMap,区别在于value和next被volatile修饰,保证并发条件下使用get获取key对应的value值为最新的。所以在jdk1.7版本的ConcurrentHashMap的get方法,并未加锁。

    static final class HashEntry<K,V> {
            final int hash;
            final K key;
            volatile V value;
            volatile HashEntry<K,V> next;
    
            HashEntry(int hash, K key, V value, HashEntry<K,V> next) {
                this.hash = hash;
                this.key = key;
                this.value = value;
                this.next = next;
            }
    
            /**
             * Sets next field with volatile write semantics.  (See above
             * about use of putOrderedObject.)
             */
            final void setNext(HashEntry<K,V> n) {
                UNSAFE.putOrderedObject(this, nextOffset, n);
            }
    
            // Unsafe mechanics
            static final sun.misc.Unsafe UNSAFE;
            static final long nextOffset;
            static {
                try {
                    UNSAFE = sun.misc.Unsafe.getUnsafe();
                    Class k = HashEntry.class;
                    nextOffset = UNSAFE.objectFieldOffset
                        (k.getDeclaredField("next"));
                } catch (Exception e) {
                    throw new Error(e);
                }
            }
        }
    

    相关文章

      网友评论

          本文标题:Entry(hashmap)和hashEntry(Concurr

          本文链接:https://www.haomeiwen.com/subject/knmkkhtx.html