并发队列基础 并发队列实现 并发字典基础 并发字典实现 同步队列实现

2017-06-14 22:05:00
admin
原创 3584
摘要:并发队列基础 并发队列实现 并发字典基础 并发字典实现 同步队列实现

一、并发队列基础

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、公平同步队列内部使用队列保存线程,线程先进先出,非公平同步队列内部使用栈保存线程,线程后进先出;

发表评论
评论通过审核之后才会显示。