频道栏目
首页 > 程序开发 > 软件开发 > 其他 > 正文
ConcurrentHashMap学习笔记
2017-01-04 09:29:10         来源:u014497087的博客  
收藏   我要投稿

ConcurrentHashMap是Concurrent包里提供的一个解决并发问题的HashMap,试着从源代码来认识这个类

首先我们来看一下ConcurrentHashMap中两个重要的内部类:Node(节点)和Segment(桶)

Node的源代码如下

    static class Node<k,v> implements Map.Entry<k,v> {
        final int hash;
        final K key;
        volatile V val;
        volatile Node<k,v> next;

        Node(int hash, K key, V val, Node<k,v> next) {
            this.hash = hash;
            this.key = key;
            this.val = val;
            this.next = next;
        }

        public final K getKey()       { return key; }
        public final V getValue()     { return val; }
        public final int hashCode()   { return key.hashCode() ^ val.hashCode(); }
        public final String toString(){ return key + "=" + val; }
        public final V setValue(V value) {
            throw new UnsupportedOperationException();
        }

        public final boolean equals(Object o) {
            Object k, v, u; Map.Entry<!--{cke_protected}{C}%3C!%2D%2D%3F%2C%3F%2D%2D%3E--> e;
            return ((o instanceof Map.Entry) &&
                    (k = (e = (Map.Entry<!--{cke_protected}{C}%3C!%2D%2D%3F%2C%3F%2D%2D%3E-->)o).getKey()) != null &&
                    (v = e.getValue()) != null &&
                    (k == key || k.equals(key)) &&
                    (v == (u = val) || v.equals(u)));
        }

        /**
         * Virtualized support for map.get(); overridden in subclasses.
         */
        Node<k,v> find(int h, Object k) {
            Node<k,v> e = this;
            if (k != null) {
                do {
                    K ek;
                    if (e.hash == h &&
                        ((ek = e.key) == k || (ek != null && k.equals(ek))))
                        return e;
                } while ((e = e.next) != null);
            }
            return null;
        }
    }
其中构造函数中需要对四个成员变量进行初期化:Key,Value,hash(散列值),next(下一个节点)

需要注意的几个方法是

setValue()时直接抛出以一个异常?(UnsupportedOperationException)

hashCode()返回该节点的散列值,该散列值为key与value的散列值按位与算出

equalsIO方法需要判断key值相同且value值相同

find()方法根据散列值及key值,遍历所有节点值取得对象节点,没有取得相应节点时返回null

其中setValue()与Hashmap不同,find()为新增方法,另外,java8中HashMap引入了树结构,在ConcurrentHashMap中尚未有反映

接下来看Segment的源代码

    static class Segment<k,v> extends ReentrantLock implements Serializable {
        private static final long serialVersionUID = 2249069246763182397L;
        final float loadFactor;
        Segment(float lf) { this.loadFactor = lf; }
    }
作为ConcurrentHashMap重要的内部类,Segment的代码只有三行,需要注意的是继承了ReentrantLock方法,可以认为Segment也是一种锁结构,构造函数中初始化了负载因子。
点击复制链接 与好友分享!回本站首页
上一篇:angular2系统学习-路由与导航(3)
下一篇:常见编码转中文,获取url参数
相关文章
图文推荐
点击排行

关于我们 | 联系我们 | 广告服务 | 投资合作 | 版权申明 | 在线帮助 | 网站地图 | 作品发布 | Vip技术培训 | 举报中心

版权所有: 红黑联盟--致力于做实用的IT技术学习网站