并发容器
并发容器概览
ConcurrentHashMap;线程安全的HashMap
CopyOnWriteArrayList:线程安全的List
BlockingQueue:这是一个接口,表示阻塞队列,非常适用于作为数据共享的通道。
ConcurrentLinkedQueue:高效的非阻塞并发队列,使用链表实现。可以看做一个线程安全的LinkedList
ConcurrentSkipListMap:是一个Map,使用跳表的数据结构进行快速查找。
集合类的历史
Vector和Hashtable
使用了synchronized,并发性能较差。
ArrayList和HashMap
虽然这两个类不是线程安全的,但是可以用 Collections.synchronizedList(new ArrayListt)和 Collections.synchronizedMap(new HashMap<K,V>())使之变成线程安全的。
ConcurrentHashMap
- Map简介
- 为什么需要ConcurrentHashMap
- HashMap的分析
- JDK1.7的ConcurrentHashMap实现和分析
- JDK1.8的ConcurrentHashMap实现和源码分析
- 对于JDK1.7和JDK1.8的优缺点,为什么要把1.7的结构改成1.8的结构?
- 组合操作: ConcurrentHashMap也不是线程安全的
- 实际生产案例
Map简介
Map接口常用方法
/**
* @Classname MapDemo
* @Description 演示Map的基本用法
* @Date 2021/2/26 10:23
* @Created by YoungLiu
*/
public class MapDemo {
public static void main(String[] args) {
Map<String,Integer> map = new HashMap<>();
System.out.println(map.isEmpty());
map.put("123",23);
map.put("456",12);
System.out.println(map.keySet());
System.out.println(map.get("123"));
System.out.println(map.size());
System.out.println(map.containsKey("123"));
}
}
为什么HashMap是线程不安全的?
- 同时put碰撞导致数据丢失
- 同时put扩容导致数据丢失
- 死循环造成的CPU100%
死循环造成的CPU100%
在多个线程同时操作hashmap时候,会造成链表的死循环,你指向我,我指向你。
hashmap分析
ConcurrentHashMap的putVal流程
ConcurrentHashMap的get流程
CopyOnWriteArrayList
并发队列
为什么要使用队列
用队列可以在线程间传递数据:生产者消费者模式、银行转账
- Queue
- BlockingQueue
BlockingQueue 阻塞队列
1. 什么是阻塞队列
2. 主要方法介绍
3. ArrayBlockingQueue
4.LinkedBlockingQueue
5. PriorityBlockingQueue
6. SynchronousQueue