ConcurrentHashMap如何支持并发访问

  • 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)

如何进行锁优化

  • 长锁不如短锁
  • 大锁不如小锁
  • 公锁不如私锁
  • 嵌套锁不如扁平锁
  • 分离读写锁
  • 粗化高频锁
  • 消除无用锁