BlockingQueue为接口,它的子类为
i.ArrayBlockingQueue:有界阻塞队列
ii.DelayQueue:对元素进行持有直到指定延迟时间
iii.LinkedBlockingQueue:内部是一个链式结构对对其元素进行存储,可以选择一个上线,如果没设置上线,则使用Integer.MAX_VALUE作为上线
iiii.PriorityBlockingQueue:无界的并发队列,它 使 用 了 和 类
java.util.PriorityQueue 一 样 的 排 序 规 则 。 你 无 法 向 这 个 队 列 中 插 入 null 值 。 所 有 插 入 到
PriorityBlockingQueue 的元素必须实现 java.lang.Comparable 接口。因此该队列中元素的排序就取决于
你自己的 Comparable 实现。
V. SynchronousQueue:内部只容纳单个元素。如果队列已有一个元素那么会阻塞直到另一个线程取走这个元素;如果一个线程要取走队列元素而此时队列中并没有那么会阻塞直到另一个线程在队列中放入一个元素
公平锁:就是在并发环境中,每个线程在获取锁时会先查看此锁维护的等待队列,如果为空,或者当前线程线
程是等待队列的第一个,就占有锁,否则就会加入到等待队列中,以后会按照 FIFO 的规则从队列中取到自己。
非公平锁:比较粗鲁,上来就直接尝试占有锁,如果尝试失败,就再采用类似公平锁那种方式
1.ArrayBlockingQueue
a.offer 方法
在队尾插入元素,如果队列满则返回 false,否者入队返回 true
b. Put 操作
在队列尾部添加元素,如果队列满则等待队列有空位置插入后返回
c. Poll 操作
从队头获取并移除元素,队列为空,则返回 null
d.Take 操作
从队头获取元素,如果队列为空则阻塞直到队列有元素。
e. Peek 操作
返回队列头元素但不移除该元素,队列为空,返回 null
f.Size 操作
获取队列元素个数,非常精确因为计算 size 时候加了独占锁,其他线程不能入队或者出队或者删除元素
2.LinkedBlockingQueue
a.poll
获取并移除队首元素,在指定的时间内去轮询队列看有没有首元素有则返回,否者超时后返回 null
b.put 操作-生产者
与带超时时间的 poll 类似不同在于 put 时候如果当前队列满了它会一直等待其他线程调用 notFull.signal
才会被唤醒。
c. take 操作-消费者
与带超时时间的 poll 类似不同在于 take 时候如果当前队列空了它会一直等待其他线程调用
notEmpty.signal()才会被唤醒
d. size 操作-消费者
当前队列元素个数,如代码直接使用原子变量 count 获取
e. peek 操作
获取但是不移除当前队列的头元素,没有则返回 null。
f. remove 操作
删除队列里面的一个元素,有则删除返回 true,没有则返回 false,在删除操作时候由于要遍历队列所以加了双重锁,也就是在删除过程中不允许入队也不允许出队操作。