队列相关问题

概述

  1. LinkedBlockingQueue的实现原理
  2. ArrayBlockingQueue的实现原理
  3. 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条件会通知所有生产者线程

LinkedBlockingQueue类图

LinkedBlockingQueue类图

ArrayBlockingQueue的实现原理

ArrayBlockingQueue类图

ArrayBlockingQueue类图

SynchronousQueue的实现原理

SynchronousQueue类图

SynchronousQueue类图

参考链接

https://segmentfault.com/a/1190000004911771

https://www.cnblogs.com/lyysz/p/5913264.html