SynchronousQueue源码总结
1. 两种模式
1.1 公平模式
使用内部类TransferQueue单向队列实现
1.2 非公平模式
使用内部类TransferStack栈实现
2.TransferQueue
2.1 单向链表,链表元素为QNode
static final class QNode {
//标识当前node的后继节点,通过next组成链表结构
volatile QNode next;
//当前节点存储的数据
volatile Object item;
//标识该节点对应的操作线程,暂停、唤醒时使用
volatile Thread waiter;
//标识当前节点所属于消费数据的线程还是生产数据的线程
final boolean isData;
}
2.1 关键点
链表初始化时生成一个item=null,isData=false的QNode
链表中除了初始化节点外只会存在一类节点,要么全是isData=true的生产者节点;要么全是isData=false的消费者节点
除了初始化节点,尝试添加节点时,发现已存在的节点isData和当前一致,则将当前节点链到链表尾部。
如果已存在节点isData和当前不一致,则唤醒head,如果当前是生产者节点还需要将自己的数据推给head。当前节点其实不入链表