多线程容器

334 阅读1分钟

容器思维导图

容器.png

容器的发展过程

vector——>Queue

1.jdk1.0开始Vector和HashTable,底层使用的是Synchronized
2.ArrayList HashSet 线程不安全版
3.Collection.synchronized*** 底层也是使用了Synchronized
4.ConcurrentLinkedQueue 底层使用的是cas

HashTable——>ConcurrentHashMap

1.HashTable 底层使用的是Synchronized
2.HashMap 线程不安全
3.Collections.synchronizedMap, 底层也是使用了Synchronized
4.ConcurrentHashMap  底层使用的是cas

使用早期的同步容器以及Collections.synchronizedXXX方法的不足之处

1. 一次只能有一个线程访问
2. 有些方法内部会调用其他方法,为了防止线程间数据占用,需要外部再加一层同步操作。
   例如:迭代或者putIfAbsent,迭代时如果其他线程插入或者删除会造成并发修改异常,putIfAbsent内部调用了 putVal(hash(key), key, value, true, true);

Queue中的主要容器

  • Queue是jdk1.5版本后添加的,主要作用是处理高并发的容器.

CocurrentLinkedQueue

底层是链表结构的容器,使用的是cas的无锁操作

Deque

双端链表,可以实现堆栈和队列

BlockingQueue

阻塞队列,改接口增加了put()和take()

BlockingQueue源码

SynchronusQueue

无缓冲阻塞队列    

SychronousQueue源码解析

3.TransferQueue

TransferQueue 会先尝试和head匹配,匹配失败就插入末尾。与SychronousQueue相比多了缓存队列,与BlockingQueue相比可以直接将元素传递 TransferQueue源码

DelayQueue

DelayQueue是BlockingQueue的实现类,在原本的基础上增加了延迟等待的操作,底层用到了PriorityQueue和Leader-Follower模式。 DelayQueue源码