- jdk1.7的时候主要是采用分段锁,它每一段的话叫做Segment,多段Segment组成了一个数组结构,它其实是继承了ReentrantLock,所以它是一种可重入锁,然后每一个Segment内部有一个数组,然后数组里面就是我们具体要存的那个Entry数据了,它的抗并发手段的话就是每一段用了不同锁,这样的话就相当于我们读写不同的段,它们相互是不影响的,这样的话它的并发度就上去了,并发度好像是16。
-
jdk1.8的时候,它的数据结构跟HashMap1.8的结构类似,数组+链表+红黑树,然后它是通过CAS+synchronized来保证并发安全的,synchronized只锁住当前链表或红黑树的首节点,只要不发生hash冲突,就不会有并发问题,效率又提升n倍。
-
那么为什么要用红黑树而不用二叉树呢?这是因为二叉树在极端情况下会退化成一个链表,形成一个全是左子树或者全是右子树一样的一个模式,比如全部值都比根节点小;而红黑树就是有一点那种自平衡的一个概念,它通过左翻转右翻转去达到一个“近似平衡”的状态。