ConcurrentHashMap的原理是引用了內部的 Segment ( ReentrantLock ) 分段鎖,保證在操作不同段 map 的時候, 可以并發執行, 操作同段 map 的時候,進行鎖的競爭和等待。從而達到線程安全, 且效率大于 synchronized。
但是在 Java 8 之后, JDK 卻棄用了這個策略,重新使用了 synchronized+CAS。
棄用原因
通過 JDK 的源碼和官方文檔看來, 他們認為的棄用分段鎖的原因由以下幾點:
1. 加入多個分段鎖浪費內存空間。
2. 生產環境中, map 在放入時競爭同一個鎖的概率非常小,分段鎖反而會造成更新等操作的長時間等待。
3. 為了提高 GC 的效率
4. 新的同步方案
既然棄用了分段鎖, 那么一定由新的線程安全方案, 我們來看看源碼是怎么解決線程安全的呢?(源碼保留了segment 代碼, 但并沒有使用)。