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();
}
}
相关推荐
本文将深入解析这两个类在Java 7和8版本中的实现原理、特点以及使用场景。 首先,`HashMap`是Java中最基本的非线程安全的散列映射容器。它基于哈希表实现,提供O(1)的平均时间复杂度进行插入、删除和查找操作。在...
本篇文章将深入解析这两种数据结构的内部实现,帮助读者理解它们的工作原理。 HashMap是Java中最常用的哈希表实现,它通过哈希函数快速定位键值对,并通过链表解决哈希冲突。在Java 7中,HashMap的内部结构主要由一...
本文将深入探讨ConcurrentHashMap的内部结构、工作原理及其在实际场景中的应用。 #### 二、结构解析 **1. 锁分段技术** ConcurrentHashMap的核心思想是将一个大哈希表分割成多个小哈希表(称为段,Segment),每...
本文将对这两个类在Java 7和8中的实现进行深入解析,尤其是它们在并发环境下的行为和优化。 首先,我们来看Java 7的HashMap。HashMap是一个非线程安全的数据结构,适用于单线程环境。它的内部结构主要由一个数组和...
《并发编程中的 ConcurrentHashMap 深度解析》 在Java编程领域,ConcurrentHashMap是一个至关重要的数据结构,尤其在多线程环境下,它提供了高效、安全的并发访问性能。本资料"ConcurrentHashMap共18页.pdf.zip...
ConcurrentHashMap#put方法源码解析 ConcurrentHashMap是Java并发编程中的一个重要组件,用于解决高并发情况下的数据存储问题。在面试中,ConcurrentHashMap的底层原理、put方法的实现细节都是高频考点。本文将对...
【源码分析】深入理解`ConcurrentHashMap`的工作原理,需要查看其源码,特别是`put`、`get`、`resize`等关键操作,以及在不同版本中的变化,例如Java 8引入的红黑树优化。 总结,`ConcurrentHashMap`是Java并发编程...
本节我们将深入解析`ConcurrentHashMap`的`put`和`get`方法,以及其初始化过程。 首先,`ConcurrentHashMap`的初始化过程在第一次`put`操作时触发,其核心在于`initTable`方法。这个方法确保在多线程环境下安全地...
Condition的使用及原理解析.mp4 使用Condition重写waitnotify案例并实现一个有界队列.mp4 深入解析Condition源码.mp4 实战:简易数据连接池.mp4 线程之间通信之join应用与实现原理剖析.mp4 ThreadLocal 使用及实现...
09MySQL深度原理解析 10Netty深度源码解读 11SpringCloud微服务框架源码解读 12彻底搞懂分布式锁架构设计原理 13分布式数据一致性设计原理 14分布式消息中间件 15实战新零售微服务电商项目 16实战新零售微服务电商...
第31节Condition的使用及原理解析00:17:40分钟 | 第32节使用Condition重写wait/notify案例并实现一个有界队列00:22:05分钟 | 第33节深入解析Condition源码00:21:15分钟 | 第34节实战:简易数据连接池00:24:53分钟...
第31节Condition的使用及原理解析00:17:40分钟 | 第32节使用Condition重写wait/notify案例并实现一个有界队列00:22:05分钟 | 第33节深入解析Condition源码00:21:15分钟 | 第34节实战:简易数据连接池00:24:53分钟...
本文将深入探讨`ConcurrentHashSet`的源码,解析其设计原理和实现细节。 首先,`ConcurrentHashSet`的核心是基于` ConcurrentHashMap `(并发哈希映射)来实现的,这使得它在多线程环境下具有高效性和线程安全性。`...
03-并发List、Set、 ConcurrentHashMap底层原理剖析-monkey 04-Java并发线程池底层原理详解与源码分析-monkey 05-并发编程之深入理解Java线程-fox 06-并发编程之CAS&Atomic原子操作详解-fox 07-并发锁机制之深入理解...
详细讲解了包括数据结构(如红黑树)、哈希表对比、并发控制机制(ConcurrentHashMap与HashTable性能对比)、Java类加载机制、数据库事务特性和隔离级别、常用中间件原理、垃圾回收算法及收集器、TCP协议深度剖析、...
第31节Condition的使用及原理解析00:17:40分钟 | 第32节使用Condition重写wait/notify案例并实现一个有界队列00:22:05分钟 | 第33节深入解析Condition源码00:21:15分钟 | 第34节实战:简易数据连接池00:24:53分钟...
第31节Condition的使用及原理解析00:17:40分钟 | 第32节使用Condition重写wait/notify案例并实现一个有界队列00:22:05分钟 | 第33节深入解析Condition源码00:21:15分钟 | 第34节实战:简易数据连接池00:24:53分钟...
【标题】: "Java Map深度解析:从面试题看HashMap与ConcurrentHashMap" 【描述】: 本资源针对Java后端开发人员,由有7年大厂经验的专家精心整理,通过一系列面试题目来深入剖析Java中的Map,特别是HashMap和...