Java 并发队列分析
阻塞式队列和非阻塞式队列 ?
使用阻塞算法的队列可以用一个锁(入队和出队用同一把锁)或两个锁(入队和出队用不同的锁)等方式来实现,而非阻塞的实现方式则可以使用循环CAS的方式来实现, 前者主要是 BlockingQueue及其是实现类,后者则是ConcurrentLinkedQueue。
BlockingQueue 常用的方法
boolean add(E)
boolean offer(E)
boolean offer(E, long, TimeUnit)
void put(E) // 阻塞式方法
E take() // 阻塞式方法
E poll(long, TimeUnit)
int remainingCapacity()
boolean remove(Object)
boolean contains(Object)
//
int drainTo(Collection<? super E>)
int drainTo(Collection<? super E>, int)
BlockingQueue 常用的实现类
ArrayBlockingQueue和LinkedBlockingQueue的区别
- 队列中锁的实现不同 ArrayBlockingQueue实现的队列中的锁是没有分离的,即生产和消费用的是同一个锁; LinkedBlockingQueue实现的队列中的锁是分离的,即生产用的是putLock,消费是takeLock
- 在生产或消费时操作不同 ArrayBlockingQueue实现的队列中在生产和消费的时候,是直接将枚举对象插入或移除的; LinkedBlockingQueue实现的队列中在生产和消费的时候,需要把枚举对象转换为Node<E>进行插入或移除,会影响性能
- 队列大小初始化方式不同 ArrayBlockingQueue实现的队列中必须指定队列的大小; LinkedBlockingQueue实现的队列中可以不指定队列的大小,但是默认是Integer.MAX_VALUE