深入理解ConcurrentHashMap

本文深入探讨了Java 1.8的ConcurrentHashMap,对比HashMap和Hashtable的线程安全性问题,解释了为何ConcurrentHashMap是推荐的选择。文章详细介绍了ConcurrentHashMap的内部存储结构,包括Node和TreeNode,以及在处理哈希冲突时如何从链表转换为红黑树。此外,还分析了put()方法的并发控制策略,包括初始化、扩容以及插入数据的处理过程,确保了在高并发下的高效性和线程安全。最后,简要总结了JDK1.8中ConcurrentHashMap的变化及其与HashMap的关系。
摘要由CSDN通过智能技术生成

深入理解ConcurrentHashMap

写在前面

前面分析了 HashMap和Hashtable 。在多线程下, HashMap 的链表可能会出现死循环,所以 HashMap 是线程不安全的。 Hashtable 在所有涉及到多线程操作的都加上了 synchronized 关键字来锁住整个 table ,虽然保证了线程安全,但是无疑效率是地下的。

针对 HashMap 线程不安全的问题, Java 给出的推荐是使用 ConcurrentHashMapConcurrentHashMap 使用 降低锁粒度 的策略,利用多个锁来控制多个小的 table(实际上每一个节点都加了锁) ,减少竞争。

ConcurrentHashMap(JDK1.8)

JDK1.8JDK1.7 都是使用 降低锁粒度 的策略,只是实现不同。在 JDK1 . 8 中, HashMap 开始使用 Node数组+链表+红黑树 的数据结构来实现, ConcurrentHashMap 在并发控制上加上了 SynchronizedCAS 操作(可以参考同步锁,乐观锁,悲观锁)。

  • 内部存储结构 Node

    transient volatile Node<K,V>[] table;
    
    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; }
        // 不允许修改value值
        public final V setValue(V value) {
            throw new UnsupportedOperationException();
        }
        /*
         * Virtualized support for map.get(); overridden in subclasses.
         * 增加find方法辅助get方法  ,HashMap中的Node类中没有此方法
         */
        Node<K,V> find(int h, Object k) {
            Node<K,V> e = this;
            if (k != null) {
                do {
                    K ek;
                    if (e.hash == h &&
                        ((ek = 
  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值