map家族对比如下
集合 | Key | Value | 有序 | 线程安全 | 初始化容量 |
---|---|---|---|---|---|
HashMap | 可以为null | 可以为null | 无序 | 线程不安全 | 16,扩容后容量翻倍 |
HashTable | 不可以为null | 不可以为null | 无序 | 线程安全,通过synchronized 实现 | 11,扩容后容量翻倍+1 |
TreeMap | 不可以为null | 可以为null | 有序 | 线程不安全 | |
LinkedHashMap | 可以为null | 可以为null | 有序 | 线程不安全 | |
ConcurrentHashMap | 不可以为null | 不可以为null | 无序 | 线程安全,通过synchronized+CAS实现 |
线程安全的map家族队员
- 使用 map = Collections.synchronizedMap(HashMap);
- Hashtable
- ConcurrentHashMap
- SynchronizedMap内部维护了一个普通的map和一个互斥锁mutex
通过synchronized关键字实现了同步 - HashTable通过synchronized关键字实现同步
- jdk1.7ConcurrentHashMap
Segment +数组+链表,Segment 继承自ReentrantLock
,每个Segment 分别加锁, 最大同时允许Segment 数量的线程同时访问 - jdk1.8ConcurrentHashMap
数组+链表+红黑树, synchronized+CAS实现线程安全