concurrentHashMap源码解读
主要理解几个问题1 ConcurrentHashMap如何实现分段锁2 存取数据是否读写分离
1 分段锁的实现
①创建默认长度16的segments数组
② put方法
1 从segments数组获取segment对象若对象为空则创建segment对象
2 将元素存入segment对象的HashEntry<K,V>table数组下标
1) 计算元素存入segment对象的HashEntry<K,V>table数组下标并判断元素是否已经存在
2)创建HashEntry对象并增加元素
③ 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方法在同一个对象多线程不能并发访问,但是不同对象多线程可以并发访问
下面看截图为证
来源:oschina
链接:https://my.oschina.net/u/3739402/blog/1785315