`
y806839048
  • 浏览: 1121603 次
  • 性别: Icon_minigender_1
  • 来自: 上海
文章分类
社区版块
存档分类
最新评论

ConcurrentHashMap 原理解析

阅读更多

ConcurrentHashMap 原理解析

ConcurrentHashMap.class

其他配套信息,初始化构造函数

 

内部类  static class Segment<K,V> extends ReentrantReadWriteLock implements Serializable 

所有增删改

 

 

 

1,初始化: 构造函数创建segements空间,并且对每个segement创建table

2,操作:操作时根据key找到segement(内部类),

3,对于put操作等,引入就锁lock(读写锁),先根据key进行hash算法找到segement,然后在桶中找到这个桶的table中的第一个,

再根据这第一个遍历,找到了就覆盖返回旧值,没找到就新增

 (由于这个table[index]存的是entry这是一个单链表结构,这样获取第一个(table[index])之后可以马上对其遍历)

 transient volatile HashEntry<K,V>[] table;//忽略这个成员变量序列化

 

 

//由于这个table是内部类,每new Segment一个桶就有一个table变量在里面,由于就是属于这个内部类的所以类似threadlocal效果,

//对于大类将有一个内部类,那么大类操作这个内部类就相当于threadlocal变量

 

  public ConcurrentHashMap(int initialCapacity,

                             float loadFactor, int concurrencyLevel) {

        if (!(loadFactor > 0) || initialCapacity < 0 || concurrencyLevel <= 0)

            throw new IllegalArgumentException();

 

        if (concurrencyLevel > MAX_SEGMENTS)

            concurrencyLevel = MAX_SEGMENTS;

 

        // Find power-of-two sizes best matching arguments

        int sshift = 0;

        int ssize = 1;

        while (ssize < concurrencyLevel) {

            ++sshift;

            ssize <<= 1;

        }

        segmentShift = 32 - sshift;

        segmentMask = ssize - 1;

        this.segments = Segment.newArray(ssize);

 

        if (initialCapacity > MAXIMUM_CAPACITY)

            initialCapacity = MAXIMUM_CAPACITY;

        int c = initialCapacity / ssize;

        if (c * ssize < initialCapacity)

            ++c;

        int cap = 1;

        while (cap < c)

            cap <<= 1;

 

        for (int i = 0; i < this.segments.length; ++i)

            this.segments[i] = createSegment(cap, loadFactor);

    }

 

 protected Segment<K, V> createSegment(int initialCapacity, float lf) {

        return new Segment<K, V>(initialCapacity, lf);

    }

 

Segment(int initialCapacity, float lf) {

            loadFactor = lf;

            setTable(HashEntry.<K,V>newArray(initialCapacity));

        }

 

 

 

 void setTable(HashEntry<K,V>[] newTable) {

            threshold = (int)(newTable.length * loadFactor);

            table = newTable;

        }

 

 

 

 

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

    }

 

 

 

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

    }

    

    

    

    V put(K key, int hash, V value, boolean onlyIfAbsent) {

            writeLock().lock();

            try {

                int c = count;

                if (c++ > threshold) // ensure capacity

                    rehash();

                HashEntry<K,V>[] tab = table;

                int index = hash & (tab.length - 1);

                HashEntry<K,V> first = tab[index];

                HashEntry<K,V> e = first;

                while (e != null && (e.hash != hash || !key.equals(e.key)))

                    e = e.next;

 

                V oldValue;

                if (e != null) {

                    oldValue = e.value;

                    if (!onlyIfAbsent)

                        e.value = value;

                }

                else {

                    oldValue = null;

                    ++modCount;

                    tab[index] = new HashEntry<K,V>(key, hash, first, value);

                    count = c; // write-volatile

                }

                return oldValue;

            } finally {

                writeLock().unlock();

            }

        }

 

分享到:
评论

相关推荐

    java7-8中的 HashMap和ConcurrentHashMap全解析

    本文将深入解析这两个类在Java 7和8版本中的实现原理、特点以及使用场景。 首先,`HashMap`是Java中最基本的非线程安全的散列映射容器。它基于哈希表实现,提供O(1)的平均时间复杂度进行插入、删除和查找操作。在...

    java7-8中的 HashMap和ConcurrentHashMap全解析.pdf

    本篇文章将深入解析这两种数据结构的内部实现,帮助读者理解它们的工作原理。 HashMap是Java中最常用的哈希表实现,它通过哈希函数快速定位键值对,并通过链表解决哈希冲突。在Java 7中,HashMap的内部结构主要由一...

    ConcurrentHashMap源码剖析

    本文将深入探讨ConcurrentHashMap的内部结构、工作原理及其在实际场景中的应用。 #### 二、结构解析 **1. 锁分段技术** ConcurrentHashMap的核心思想是将一个大哈希表分割成多个小哈希表(称为段,Segment),每...

    2.Java7_8+中的+HashMap+和+ConcurrentHashMap+全解析1

    本文将对这两个类在Java 7和8中的实现进行深入解析,尤其是它们在并发环境下的行为和优化。 首先,我们来看Java 7的HashMap。HashMap是一个非线程安全的数据结构,适用于单线程环境。它的内部结构主要由一个数组和...

    ConcurrentHashMap共18页.pdf.zip

    《并发编程中的 ConcurrentHashMap 深度解析》 在Java编程领域,ConcurrentHashMap是一个至关重要的数据结构,尤其在多线程环境下,它提供了高效、安全的并发访问性能。本资料"ConcurrentHashMap共18页.pdf.zip...

    高薪程序员面试题精讲系列49之说说ConcurrentHashMap#put方法的源码及数。。。.pdf,这是一份不错的文件

    ConcurrentHashMap#put方法源码解析 ConcurrentHashMap是Java并发编程中的一个重要组件,用于解决高并发情况下的数据存储问题。在面试中,ConcurrentHashMap的底层原理、put方法的实现细节都是高频考点。本文将对...

    24 经典并发容器,多线程面试必备。—深入解析ConcurrentHashMap.pdf

    【源码分析】深入理解`ConcurrentHashMap`的工作原理,需要查看其源码,特别是`put`、`get`、`resize`等关键操作,以及在不同版本中的变化,例如Java 8引入的红黑树优化。 总结,`ConcurrentHashMap`是Java并发编程...

    25 经典并发容器,多线程面试必备—深入解析ConcurrentHashMap下.pdf

    本节我们将深入解析`ConcurrentHashMap`的`put`和`get`方法,以及其初始化过程。 首先,`ConcurrentHashMap`的初始化过程在第一次`put`操作时触发,其核心在于`initTable`方法。这个方法确保在多线程环境下安全地...

    Java并发编程原理与实战

    Condition的使用及原理解析.mp4 使用Condition重写waitnotify案例并实现一个有界队列.mp4 深入解析Condition源码.mp4 实战:简易数据连接池.mp4 线程之间通信之join应用与实现原理剖析.mp4 ThreadLocal 使用及实现...

    蚂蚁java架构师(第七/八期含项目) |课件完整|完结无秘

    09MySQL深度原理解析 10Netty深度源码解读 11SpringCloud微服务框架源码解读 12彻底搞懂分布式锁架构设计原理 13分布式数据一致性设计原理 14分布式消息中间件 15实战新零售微服务电商项目 16实战新零售微服务电商...

    龙果 java并发编程原理实战

    第31节Condition的使用及原理解析00:17:40分钟 | 第32节使用Condition重写wait/notify案例并实现一个有界队列00:22:05分钟 | 第33节深入解析Condition源码00:21:15分钟 | 第34节实战:简易数据连接池00:24:53分钟...

    Java 并发编程原理与实战视频

    第31节Condition的使用及原理解析00:17:40分钟 | 第32节使用Condition重写wait/notify案例并实现一个有界队列00:22:05分钟 | 第33节深入解析Condition源码00:21:15分钟 | 第34节实战:简易数据连接池00:24:53分钟...

    ConcurrentHashSet-main-源码.rar

    本文将深入探讨`ConcurrentHashSet`的源码,解析其设计原理和实现细节。 首先,`ConcurrentHashSet`的核心是基于` ConcurrentHashMap `(并发哈希映射)来实现的,这使得它在多线程环境下具有高效性和线程安全性。`...

    图灵Java高级互联网架构师第6期并发编程专题笔记.zip

    03-并发List、Set、 ConcurrentHashMap底层原理剖析-monkey 04-Java并发线程池底层原理详解与源码分析-monkey 05-并发编程之深入理解Java线程-fox 06-并发编程之CAS&Atomic原子操作详解-fox 07-并发锁机制之深入理解...

    阿里巴巴面试指南及其最佳答案解析

    详细讲解了包括数据结构(如红黑树)、哈希表对比、并发控制机制(ConcurrentHashMap与HashTable性能对比)、Java类加载机制、数据库事务特性和隔离级别、常用中间件原理、垃圾回收算法及收集器、TCP协议深度剖析、...

    龙果java并发编程完整视频

    第31节Condition的使用及原理解析00:17:40分钟 | 第32节使用Condition重写wait/notify案例并实现一个有界队列00:22:05分钟 | 第33节深入解析Condition源码00:21:15分钟 | 第34节实战:简易数据连接池00:24:53分钟...

    java并发编程

    第31节Condition的使用及原理解析00:17:40分钟 | 第32节使用Condition重写wait/notify案例并实现一个有界队列00:22:05分钟 | 第33节深入解析Condition源码00:21:15分钟 | 第34节实战:简易数据连接池00:24:53分钟...

    通过面试题带你了解java的Map

    【标题】: "Java Map深度解析:从面试题看HashMap与ConcurrentHashMap" 【描述】: 本资源针对Java后端开发人员,由有7年大厂经验的专家精心整理,通过一系列面试题目来深入剖析Java中的Map,特别是HashMap和...

Global site tag (gtag.js) - Google Analytics