ConcurrentHashMap 1.8
以下cchm代表concurrenthashmap
1.相比于1.7剔除了segment分段锁,但本质上都是锁竞争
2.使用synchronized+cas保证节点线程安全
3.结构上,和hashmap一样,像加载因子、初始容量等
4.对比hashtable,hashtable 是对全table加锁,cchm对当前需要操作的index对应的node节点上锁
5.1.8的cchm可能会造成cpu飙高,原因在于自旋中的cas下的初始化代码崩溃的话,会不断自旋并且不放弃CPU执行权,一直cas
部分源码分析知识点
1.不支持key为null,value为null
2.putval方法内部有一个死循环,靠break退出,也就是自旋
3.节点数组table是volatile修饰的,保证了主存可见性
4.懒加载的方式初始化table数组,每次put的时候判断table数组是否为空
5.初始化table数组的时候也是自旋
6.sizeCtl参数,控制table的初始化和扩容
默认为0 ,没有线程在扩容
-1标识其他线程正在扩容,自旋过程中放弃CPU使用权;
-2标识有两个线程在扩容等等
自旋时通过CAS判断并修改该参数
7.对于table中的某个node节点的修改权也是通过cas+自旋的方式确定的
8.sychronized锁使用的前提是node节点已经初始化并且被竞争
CAS使用是在多线程竞争,但是index没有冲突
9.做size++的时候,使用的是cas,如果失败了,不会一直自旋,会把+1这个操作放到当前线程中的counterCell中,这是一个共享的数组变量。
为啥剔除segment对象
1.剔除之后只用计算一次index
2.省内存
为什么使用synchronized锁而不使用lock锁
1.8的synchronized锁已经优化过,同时lock锁不带自旋