并发队列基础 并发队列实现 并发字典基础 并发字典实现 同步队列实现
- 2017-06-14 22:05:00
- admin
- 原创 3428
一、并发队列基础
interface java.util.Queue extends Collection
1、boolean offer(E o),插入元素;
2、E poll(),检索并移除元素;
3、E peek(),获取队列顶部元素;
class java.util.AbstractQueue implements Queue
1、boolean add(E o),插入元素,如果无法插入则抛出IllegalStateException;
2、E remove(),检索并移除元素,如果队列为空则抛出NoSuchElementException;
3、E element(),获取队列顶部元素,如果队列为空则抛出NoSuchElementException;
interface java.util.concurrent.BlockingQueue extends Queue
1、boolean offer(E o),插入元素;
2、boolean add(E o),插入元素,如果无法插入则抛出IllegalStateException;
3、boolean offer(E o),long timeout, TimeUnit unit),插入元素,允许指定超时时间;
4、E poll(long timeout, TimeUnit unit),检索并移除元素,允许指定超时时间;
5、void put(E o),插入元素,如果无法插入则一直等待;
6、E take(),检索并移除元素,如果无法获取则一直等待;
使用详解:
1、AbstractQueue不允许插入null元素,否则抛出NullPointerException;
2、BlockingQueue不允许插入null元素,否则抛出NullPointerException;
二、并发队列实现
ConcurrentLinkedQueue
1、继承AbstractQueue抽象类,FIFO无锁并发队列,使用CAS机制实现,不存在容量限制;
2、size,需要遍历队列进行计算,非固定时间操作;
ArrayBlockingQueue
1、继承AbstractQueue抽象类,实现BlockingQueue接口,FIFO有锁阻塞队列,存在容量限制,默认是非公平队列;
2、size,加锁后从count字段读取,非常准确高效;
LinkedBlockingQueue
1、LinkedBlockingQueue和ArrayBlockingQueue功能类似,FIFO有锁阻塞队列,不存在容量限制,只能是公平队列;
2、LinkedBlockingQueue有两把锁,读和写使用不同的锁,通常吞吐量更大;
3、LinkedBlockingQueue插入数据时会创建Node对象,会对GC造成一定影响;
三、并发字典基础
interface ConcurrentMap extends Map
1、V putIfAbsent(K key, V value),如果key不存在,插入元素并返回null,否则返回之前元素;
2、boolean remove(Object key, Object value),如果key存在,且对应值为value,删除元素;
3、boolean replace(K key, V oldValue, V newValue),如果key存在,且对应值为value,替换元素;
4、V replace(K key, V value),如果key存在,替换元素;
四、并发字典实现
ConcurrentHashMap
1、继承AbstractMap抽象类,实现ConcurrentMap接口,使用加锁和CAS机制实现,并发访问效率很高;
2、构造函数参数:initialCapacity初始容量,loadFactor加载因子,concurrencyLevel并发级别,设置为CPU核数;
五、同步队列实现
SynchronousQueue
1、继承AbstractQueue抽象类,实现BlockingQueue接口,一个特殊并发队列,不存在任何容量,默认非公平策略;
2、同步队列用于线程间传递信息,性能非常高,因为没有容量,没有线程等待接收元素时,非阻塞插入元素会失败;
3、公平同步队列内部使用队列保存线程,线程先进先出,非公平同步队列内部使用栈保存线程,线程后进先出;