ConcurrentLinkedQueue、LinkedBlockingQueue 、ArrayBlockingQueue之间的区别和联系

非阻塞队列

ConcurrentLinkedQueue:可以看做是一个线程安全的LinkedList,适用于许多线程共享访问一个公共集合,是一个基于链接节点的无界线程安全队列,它采用先进先出的规则对节点进行排序,当我们添加一个元素的时候,它会添加到队列的尾部;当我们获取一个元素时,它会返回队列头部的元素。它采用了“wait-free”算法(即CAS算法)来实现。

常用方法:

boolean add(E e):将元素e插入到队列末尾,插入成功,则返回true;插入失败(即队列已满),返回false;
boolean offer(E e)将元素e插入到队列末尾,插入成功,则返回true;插入失败(即队列已满),返回false;和add一样
E peek():    获取但不移除此队列的头;如果此队列为空,则返回 null。
E poll():获取队首元素并移除,若队列不为空,则返回队首元素;否则返回null;
boolean remove(Object o):从队列中移除指定元素的单个实例(如果存在)。

阻塞队列

LinkedBlockingQueue、ArrayBlockingQueue:适合作为数据共享通道,一般作为实现生产消费者模式的容器,实现了BlockingQueue接口内部采用ReentrantLock和Condition来保证生产和消费者的同步;ArrayBlockingQueue的生产和消费者是同一把锁put()和take方法使用同一个lock,LinkedBlockingQueue的得益于其数据结构采用锁分离方式take()使用takeLock,put使用putLock从而效率更高,并且ArrayBlockingQueue使用必须要指定容量,但是LinkedBlockingQueue不指定容量默认为Integer.MAX_VALUE

常用方法

boolean add(E e)在插入此队列的尾部,如果有可能立即这样做不超过该队列的容量,返回指定的元素 true成功时与抛出 IllegalStateException如果此队列已满。
void put(E e)将指定的元素插入此队列的尾部,如果该队列已满,则一直等到(阻塞)。 
boolean offer(E e) : 成功返回 true,如果此队列已满,则返回 false(如果添加了时间参数,且队列已满也会阻塞)
public boolean offer(E e, long timeout, TimeUnit unit)  throws InterruptedException将指定的元素插入到此队列的尾部(如果立即可行且不会超过该队列的容量) 将指定的元素插入此队列的尾部,如果该队列已满, 则在到达指定的等待时间之前等待可用的空间,该方法可中断

E take() throws InterruptedException; 获取并移除此队列的头部,如果没有元素则等待(阻塞), 直到有元素将唤醒等待线程执行该操作 
E poll();获取并移除此队列的头,如果此队列为空,则返回 null
 E peek();获取但不移除此队列的头;如果此队列为空,则返回 null。
E poll(long timeout, TimeUnit unit) throws InterruptedException; 获取并移除此队列的头部,在指定的等待时间前一直等到获取元素, //超过时间方法将结束
boolean remove(Object o);从此队列中移除指定元素的单个实例(如果存在)。

 

 

你可能感兴趣的:(Java杂记)