SynchronousQueue是一种特殊的阻塞队列,不同于LinkedBlockingQueue、ArrayBlockingQueue和PriorityBlockingQueue,其内部没有任何容量,任何的入队操作都需要等待其他线程的出队操作,反之亦然。如果将SynchronousQueue用于生产者/消费者模式,那么相当于生产者和消费者手递手交易,即生产者生产出一个货物,则必须等到消费者过来取货,方可完成交易。
SynchronousQueue有一个fair选项,如果fair为true,称为fair模式,否则就是unfair模式。在fair模式下,所有等待的生产者线程或者消费者线程会按照开始等待时间依次排队,然后按照等待先后顺序进行匹配交易。这种情况用队列实现。在unfair模式下,则刚好相反,后来先匹配,这种情况用栈实现。
基本原理
SynchronousQueue通过将入队出队的线程绑定到队列的节点上,并借助LockSupport的park()和unpark()实现等待,先到达的线程A需调用LockSupport的park()方法将当前线程进入阻塞状态,直到另一个与之匹配的线程B调用LockSupport.unpark(Thread)来唤醒在该节点上等待的线程A。
基本逻辑:
- 初始状态队列为null。
- 当一个线程到达,如果队列为null,则进入队列等待,或该请求超时取消。
- 当第二个线程到达,如果队列不为null,则判断队列中的第一个元素(针对fair和unfair不同)是否与其匹配:如果匹配,则完成交易后从队列删除第一个线程;如果不匹配,则也入队。