ThreadPoolExecutor三种队列

SynchronousQueue

无缓冲的等待队列,在添加元素后必须等待其他线程取走后才能继续添加

可理解缓存值为1的阻塞队列,isEmtpy()永远返回true,remove(),removeAll()永远返回false, peek()永远返回null.

内部维护一个transfer,有两种模式

  • TransferQueue:公平模式,采用公平锁,配合FIFO队列阻塞多余生产者和消费者
  • TransferStack:非公平模式,配合一个LIFO队列来管理多余的生产者和消费者;如果生产者和消费者处理速度有差距,则出现饥渴情况

LinkedBlockingQueue

无界缓存等待队列,基于链表的阻塞队列,内部维护这一个数据缓缓冲队列;可设置最大缓存值。

LinkedBlockingQueue之所以能够高效的处理并发数据,还因为其对于生产者端和消费者端分别采用了独立的锁来控制数据同步

/** Wait queue for waiting takes */
private final Condition notEmpty = takeLock.newCondition();

/** Lock held by put, offer, etc */
private final ReentrantLock putLock = new ReentrantLock();

ArrayBlockingQueue

确定长度的(构造函数必传参数)基于数组的阻塞队列;两个整型值标记 头部和尾部在数组中的位置。只有一个锁控制所有的访问。

/** items index for next take, poll, peek or remove */
int takeIndex;

/** items index for next put, offer, or add */
int putIndex;

/** Main lock guarding all access */
final ReentrantLock lock;