并发容器精讲——面试杀手锏
目录并发容器概览
-
ConcurrentHashMap:线程安全的HashMap
-
CopyOnWriteArrayList:线程安全的List
-
BlockingQueue:这是一个接口,表示阻塞队列,非常适用于作为数据共享的通道
趣说集合类的历史——古老和过时的同步容器
-
Vector和HashTable(原理都是用synchronized修饰)
- 早期JDK
- 并发性能差
-
HashMap和ArrayList
- 虽然这两个类不是线程安全的,但是可以用Collections.synchronizedList(new ArrayL:ist
)和==Collections.synchronizedMap(new HashMap:ist<K,V>)使之变成线程安全的
- 虽然这两个类不是线程安全的,但是可以用Collections.synchronizedList(new ArrayL:ist
-
ConcurrentHashMap和CopyOnWriteArrayList
- 取代同步的HashMap和同步的ArrayList
- 绝大多数并发情况下,ConcurrentHashMap和CopyOnWriteArrayList的性能都要好。
ConcurrentHashMap(重点、面试常考)
为什么HashMap是线程不安全的?
- 同时put碰撞导致数据丢失
两个线程同时put某一个桶内数据,会导致只有一个put成功
- 同时put扩容导致数据丢失
- 死循环造成的CPU100%
- HashMap在高并发下的死循环(仅在JDK1.7及以前存在):多线程同时扩容时,可能造成循环链表,导致CPU 100%
HashMap 1.7结构
HashMap 1.8结构
HashMap关于并发的特点
- 非线程安全
- 迭代时不允许修改内容
- 只读的并发是安全的
- 如果一定要线程安全,需要借助Collections.synchronizedList
JDK 1.7 ConcurrentHashMap实现和分析
JDK1.8的ConcurrentHashMap实现和分析
- 简介
- 结构图