1)ConcurrentHashMap的原理分析
(1)Collections.SynchronizedMap: 把不安全的集合变为不安全的
(2)2个API
put:putVal
get
(3)Spring Bean
(4)怎么去解决并发安全的问题的: 并发安全 + 效率
(5)分段锁:1.7
1.8: 变化1:取消分段segment 变化2:数组+单向链表--》数组+单向链表+红黑树
(6)表转树的原因: 1.检索快
(7)思考1000个元素存入HashMap的过程:
1.默认分配16个数组,一个元素计算一下,看落到哪个地方了,如果冲突落到了同一个位置,就形成一个单向链表。
2.红黑树: 节点要么是红色,要么是黑色。 链长度》8,数组长度》64的时候,就会把 链表--》红黑树。 反之,从 红黑树-》链表
3.sizeCtl:
考虑initTable,如果10个线程都进来会怎样?
volatile 的 写 一定 happen-before 读
4.并发非常高的时候,cas不可行。 atomic也是一种cas,并发量非常高的时候,都在for循环cas,比较占用资源。
因此采用分段cas
5.加锁--》性能也会下降
addCount
(8)分片、分而治之
(9)扩容: 可以多线程投并行扩容
高16位: 扩容标记
低16位: 扩容线程数
需要保证每次扩容的扩容戳都是唯一的。 因此可以支持并发扩容。
分段处理的思想。
(10)CHM的设计思想
1.通过数组的方式来实现并发增加元素的个数。
2.并发扩容,可以通过多个线程来并行实现数据的迁移。
3.采用高低链的方式来解决多次hash计算的问题。
4.sizeCtl的设计,3表示状态。
5.resizeStamp的设计,高低位的设计来实现唯一性以及多个线程的协助扩容记录。
2)红黑树的基本原理
1.高低位 transfer
2.红黑树
treeifyBin: 要么扩容处理,要么就转化为红黑树。
二叉查找树:左子节点 《 根节点 《 右子节点。
10--》11--》12--》13.。。假如一直这样极端情况,就成一条链了。
红黑树也是平衡二叉树,且满足5个条件。
当加入一个节点导致:当前这棵树不满足条件时,就会采取左旋或者右旋,并重新着色的方式,重新达到平衡。