public class SynchronousQueueextends AbstractQueue implements BlockingQueue , java.io.Serializable {...}
SynchronousQueue是一个没有数据缓冲的同步阻塞队列,生产者线程对其的插入操作put必须等待消费者的移除操作take,反过来也一样。不像ArrayBlockingQueue或linkedListBlockingQueue,SynchronousQueue内部并没有数据缓存空间,你不能调用peek()方法来看队列中是否有数据元素,因为数据元素只有当你试着取走的时候才可能存在。队列不支持迭代,因为无元素可迭代。
public boolean isEmpty() {
return true;
}
public int size() {
return 0;
}
public E peek() {
return null;
}
队列头部是第一个排队要插入数据的线程,而不是要交换的数据。数据是在配对的生产者和消费者线程之间直接传递的,并不会将数据缓冲数据到队列中。可以这样来理解:生产者和消费者互相等待对方,握手,然后一起离开。
源码分析以JDK1.8源码来分析,SynchronousQueue内部核心实现由TransferStack和TransferQueue实现,这两个类共同实现了Transferer接口,其他3个内部类,官方解释说是为了兼容之前的JDK版本序列化而保留的,JDK1.8中不用关心。
abstract static class Transferer{ abstract E transfer(E e, boolean timed, long nanos); } public SynchronousQueue() { this(false); } private transient volatile Transferer transferer; public SynchronousQueue(boolean fair) { transferer = fair ? new TransferQueue () : new TransferStack (); } public boolean offer(E e) { if (e == null) throw new NullPointerException(); return transferer.transfer(e, true, 0) != null; } public E take() throws InterruptedException { E e = transferer.transfer(null, false, 0); if (e != null) return e; Thread.interrupted(); throw new InterruptedException(); }
可以看到,核心方法的实现由TransferStack和TransferQueue实现,其中TransferQueue是双重队列实现,保证元素的先进先出,TransferStack是双重栈的实现,先进后出。
关于TransferStack和TransferQueue的源码,个人感觉有点吃力,暂时放下。



