BlockingQueue
ArrayBlockingQueue
锁&条件
实现的队列中的锁是没有分离的,即生产和消费用的是同一个锁
吞吐相对低一点
两个条件(notFull、notEmpty)
内存分配
提前分配好一大块连续的内存
如果内存碎片较多的时候,就不合适
入队、出队时,直接对象进出(几乎再无内存分配)
因此在插入或删除元素时不会产生或销毁任何额外的对象实例
大小
需提前指定
公平性
默认非公平阻塞队列
ArrayBlockingQueue nonFairQueue = new ArrayBlockingQueue(2);
公平阻塞队列
ArrayBlockingQueue fairQueue = new ArrayBlockingQueue(2,true);
方法
入队
共同点
须获取到操作锁(出、入是同一把锁)
随机唤醒一个在出列方法中(take方法、poll的超时方法)中阻塞的线程
notEmpty.signal()
有返回值的,就不会阻塞;阻塞的,就没有返回值(因为不知道什么时候返回)
put
成功
返回 void
失败
(一直)阻塞当前线程
notFull.await()
offer(E e)
成功
返回true
失败
返回 false
offer(E e, long timeout, TimeUnit unit)
同put()方法一样,唯一不同的是 put方法是永久等待,而这个方法是超时等待。
出队
共同点
须获取到操作锁(出、入是同一把