HashMap、HashTable、ConcurrentHashMap
- HashMap在多线程环境下,使用HashMap进行put操作会引起死循环,导致CPU 利用率接近100%。 HashMap在并发进行put操作会引起死循环,因为多线程会导致HashMap的Entry链表形成环形数据结构,一旦形成,Entry的next节点永远不为空,就会产生死循环获取Entry.
- HashTable使用synchronized来保证线程安全,但在激烈竞争的情况下效率非常低下。因为一个线程访问HashTable的同步方法,其他线程也访问HashTable的同步方法时,会进入阻塞或轮循状态。如线程1使用put进行元素添加,线程2不但不能使用put方法进行添加元素,也不能使用get方法获取元素,所以竞争越激烈效率越低。
- HashTable在积累并发的环境下表现出效率低下的原因是所有访问HashTable的线程都必须竞争同一把锁。ConcurrentHashMap使用锁分段技术,首先将数据分为一段一段的存储,然后给每一段数据配一把锁,当一个线程占用锁访问其中一段数据的时候,其他段的数据也能被其他线程访问。
ConcurrentHashMap由Segment数组结构和HashEntry数组结构组成。Segment是一种可重入锁(ReentrantLock),扮演锁的角色;HashEntry用于存储键值对数据。 为了能通过位于散列算法来定位segment数组的索引,必须保证Segment数组的长度是2的N次方,所以必须计算出一个大于或等于concurrencyLevel的最小的2的N次方值来作为segment数组的长度。
Copyright: 采用 知识共享署名4.0 国际许可协议进行许可
Links: https://cloud.tencent.com/developer/article/2020431