1.7

  1. 数组 + 链表
  2. Segment分段锁, Segment是一种可重入锁(继承了ReentrantLock)

    1.8

  3. 数组 + 链表 + 红黑树,当链表超过8是 会自动转成红黑树,小于6时转回链表

  4. CAS + synchronized, 锁的是table[i], CAS是设置头节点时用到

    为什么不用ReentrantLock而用synchronized ?

  • 减少内存开销:如果使用ReentrantLock则需要节点继承AQS来获得同步支持,增加内存开销,而1.8中只有头节点需要进行同步。
  • 内部优化:synchronized则是JVM直接支持的,JVM能够在运行时作出相应的优化措施:锁粗化、锁消除、锁自旋等等。