版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/qq_34169802/article/details/84339240
1.HashMap
是线程不安全的,在多线程环境下,使用Hashmap进行put操作会引起死循环,导致CPU利用率接近100%,所以在并发情况下不能使用HashMap。其结构如下:数组+链表结构(JDK1.8改为数组+红黑树)
2.HashTable
基本与HashMap的实现原理一样,差别是:
- HashTable不允许key和value为null
- HashTable是线程安全的(get/put所有相关操作都是synchronized,相当于把整个哈希表加锁了)
3.ConcurrentHashMap
分段的HashTable(分段锁),简单理解就是,ConcurrentHashMap 是一个 Segment 数组,Segment 通过继承 ReentrantLock 来进行加锁,所以每次需要加锁的操作锁住的是一个 segment,这样只要保证每个 Segment 是线程安全的,也就实现了全局的线程安全。
initialCapacity:初始容量(默认16,可自定义,一旦初始化后就不可以扩容),这个值指的是整个 ConcurrentHashMap 的初始容量,实际操作的时候需要平均分给每个 Segment。
loadFactor:负载因子,这个负载因子是给每个 Segment 内部使用的。