1.7
- 数组 + 链表
Segment分段锁, Segment是一种可重入锁(继承了ReentrantLock)
1.8
数组 + 链表 + 红黑树,当链表超过8是 会自动转成红黑树,小于6时转回链表
- CAS + synchronized, 锁的是table[i], CAS是设置头节点时用到
为什么不用ReentrantLock而用synchronized ?
- 减少内存开销:如果使用ReentrantLock则需要节点继承AQS来获得同步支持,增加内存开销,而1.8中只有头节点需要进行同步。
- 内部优化:synchronized则是JVM直接支持的,JVM能够在运行时作出相应的优化措施:锁粗化、锁消除、锁自旋等等。