Java 中 ConcurrentHashMap 1.7 和 1.8 之间有哪些区别?
Java 中 ConcurrentHashMap 1.7 和 1.8 之间有哪些区别?
JDK 1.7 ConcurrentHashMap
采用的是分段锁,即每个 Segment
是独立的,可以并发访问不同的 Segment
,默认是 16 个 Segment
,所以最多有 16 个线程可以并发执行。
而 JDK 1.8 移除了 Segment
,锁的粒度变得更加细化,锁只在链表或红黑树的节点级别上进行。通过 CAS 进行插入操作,只有在更新链表或红黑树时才使用 synchronized
,并且只锁住链表或树的头节点,进一步减少了锁的竞争,并发度大大增加。
并且 JDK 1.7 ConcurrentHashMap
只使用了数组 + 链表的结构,而 JDK 1.8 和 HashMap
一样引入了红黑树。
除此之外,还有扩容的区别以及 size
方法的计算也不一样。