一、诞生之初
ConcurrentHashMap的目标是实现高并发,高吞吐量的hashmap。(引用自:https://www.jianshu.com/p/bf5926b6dcde)
二、解决的问题
要实现高并发、高吞吐量,要解决两个问题:性能和保证线程安全。
- 为了线程安全,链表/红黑树,是必须得加锁的;(否则导致指针的关系错乱)
- 为了性能,对共享资源的操作,“一句话”/“一行代码”能完成的,用CAS;“多行代码”才能完成的,用synchronized同步块;
- 为了性能,细化了锁粒度;(16 -> 1)
- 为了性能,多线程帮助扩容;
三、CAS小总结
1. 真身
CMPXCHG汇编指令,原子指令。
2. 使用模式
- 无限循环;
- 期望值;
while(!setFlag){
value = getValue();
if (compareAndSetInteger(expValue, value, value++)){
setFlag = true;
}
}
3. vs 重量级锁
官方一点讲,相对于重量级锁,CAS的使用模式,减少了线程状态切换的消耗,有性能优势。