- CHM分段锁的Hash优化JDK6(之前分段不均匀)
- CHM分段锁懒加载JDK7
- CHM摒弃分段锁JDK8(通过hash(key)访问table,对单个table元素加锁)
CHM如何计数
- JDK5-7基于段元素个数求和,二次不同就加锁
- JDK8引入CounterCell,本质上也是分段计数
CHM是弱一致性都
- 添加元素后不一定马上能读到
- 清空之后可能仍然会有元素
- 遍历之前的段元素的变化会读到
- 遍历之后的段元素变化读不到
- 遍历时元素发生变化不抛异常
HashTable的问题
- 大锁:对HashTable对象加锁
- 长锁:直接对方法加锁
- 读写锁共用:只有一把锁,从头锁到尾
针对HashTable的优化,CHM的解法
- 小锁:分段锁(5-7)、桶节点锁(8)
- 短锁:先尝试获取,失败再加锁
- 分离读写锁:读失败再加锁(5-7),volatile读CAS写(7-8)
如何进行锁优化
- 长锁不如短锁
- 大锁不如小锁
- 公锁不如私锁
- 嵌套锁不如扁平锁
- 分离读写锁
- 粗化高频锁
- 消除无用锁