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