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锁不带自旋

 

posted @ 2023-08-18 00:10  sellingpear  阅读(32)  评论(0)    收藏  举报