概述
- LinkedBlockingQueue的实现原理
- ArrayBlockingQueue的实现原理
- SynchronousQueue的实现原理
BlockingQueue提供的方法分析
抛出异常 | 返回特殊值 | 一直阻塞 | 超时退出 | |
---|---|---|---|---|
插入方法 | add(e) | offer(e) | put(e) | offer(e, time unit) |
移除方法 | remove() | poll() | take() | poll(time, unit) |
检查方法 | element() | peek() | - | - |
LinkedBlockingQueue的实现原理
- LinkedBlockingQueue在构造时可以指定队列大小,如果不指定,默认使用Integer.MAX_VALUE;
- add方法继承自AbstractQueue,实质上是调用offer方法向队列中加入元素,不管是offer还是put都不允许被加入的元素是null,否则将抛出空指针异常;
- 内部有两把重入锁,分别是putLock和takeLock,还有两个条件,分别是putLock创建的notFull,以及takeLock创建的notEmpty,不同的锁对应元素的入队和出队操作,提高并发的效率,比如putLock锁在生产者向队列添加元素时起作用,而takeLock锁在消费者在队列获取元素时起作用;不同的条件,可以通知不同的线程,比如notEmpty条件会通知所有消费者线程,notFull条件会通知所有生产者线程