为什么要使用ConcurrentHashMap?
- HashMap线程不安全,多个线程同时
putVal
会造成死循环(在扩容过程中,链表成环)
扩容过程:遍历旧桶,对每个桶里的链表entry,使用头插法放入对应新桶,即与原来的顺序相反。头插法过程中会改变头节点,当一个线程resize进度快于另外一个线程时,就会出现前一个链表插入后的后继仍然时原来的后继节点,这就出现了环。参考
- Hashtable效率底下,(依靠synchronized来同步方法)不能多读。
- ConcurrentHashMap利用锁分段技术,用多把锁提升了并发访问,同时扩容也只涉及到单个段,不涉及全部的段
ConcurrentHashMap结构
参考
Java并发编程的技术