ConcurrentHashMap总结

ConcurrentHashMap

容器有16把锁,每把锁对应一个segment数组

为什么要用concurrentHashMap?
1.在并发编程过程中,使用hashMap的话,在put的过程中,因为多线程会导致链表形成环形数据结构。一旦形成环形,next节点永远不为空,就产生了死循环。
2.如果使用hashTable的话,因为底层是用synchronized来保证线程安全的,一旦线程竞争激烈将进入阻塞或者轮询状态,导致效率非常低下。
3.concurrentHashMap采用的锁分段技术,可以提升效率。而且get操作不像hashTable那样才加锁,get要用的共享变量采用的是volatile,所以不需要加锁。效率会很高。


concurrentHashMap什么时候扩容?如何扩容?

1. 先定位到segment数组,判断hshEntry数组是否需要扩容。这也是put的过程。与hashMap不同的是,hashMap是先插入在判断是否要扩容,concurrentHashMap是先判断是否需要扩容,在插入。

2.扩容时,先创建一个与原来两倍的数组。将原来的数据进行散列后在插入新的数组。为了高效,只会对每个segment扩容,不对整个容器扩容。


size操作时怎么实现的?
如果锁住容器计算是低效的。concurrentHashMap采用的是不锁segment进行两次统计判断结果,如果结果一样就返回size。如果不一样就锁住,进行统计。



你可能感兴趣的:(多线程并发)