concurrentHashMap源码解读数组
主要理解几个问题1 ConcurrentHashMap如何实现分段锁2 存取数据是否读写分离多线程
1 分段锁的实现并发
①建立默认长度16的segments数组性能
② put方法spa
1 从segments数组获取segment对象若对象为空则建立segment对象线程
2 将元素存入segment对象的HashEntry<K,V>table数组下标对象
1) 计算元素存入segment对象的HashEntry<K,V>table数组下标并判断元素是否已经存在rem
2)建立HashEntry对象并增长元素get
③ remove方法源码
remove方法和put方法相似
1计算hash值从segments取出segment
2segment加锁并计算hash值从table中取出元素,而后unsafe将根据下标设置为null便可
④ get方法
get方法读取数据不加锁,能够多线程并发访问
总结:
ConcurrentHashMap实现分段锁的原理
1 在构造方法默认初始化长度16(使用其余的构造方法能够指定长度)的segments数组
2 在put中取出单个segment(segment为空则建立segment对象),而后对segment加锁,再而后元素存入segment的table数组中
在这种机制下concurrentHashMap相对于HashTable的性能就提升了16倍,由于每一个segment对象都独立得到一个对象锁,每一个segment的table的数据均可以独立并发访问
用一张简图来表示ConcurrentHashMap和HashTable的区别
注意:
1ConcurentHashMap读写数据是独立进行的,不会互相受影响,即读取和写入数据都不会由于是否同一个对象或者同一个线程而被互相阻塞,互相不影响
2 写入数据时,即put方法在同一个对象多线程不能并发访问,可是不一样对象多线程能够并发访问
下面看截图为证