BlockingQueue之ArrayBlockingQueue和LinkedBlockingQueue
SynchronousQueue是一个双栈双队列算法,无空间的队列或栈,任何一个对SynchronousQueue写需要等到一个对SynchronousQueue的读操作,反之亦然。SynchronousQueue更像是一个数据交换通道,生产者和消费者是需要组队完成工作,缺少一个将会阻塞线程,直到配对成功为止。
SynchronousQueue是一个队列和栈算法实现,在SynchronousQueue中双队列FIFO提供公平模式,而双栈LIFO提供的则是非公平模式。
对于SynchronousQueue来说,他的put方法和take方法都被抽象成统一方法来进行操作,通过抽象出内部类Transferer,来实现不同的操作。
与ArrayBlockingQueue和LinkedListBlockingQueue不同,SynchronousQueue内部并没有数据缓存空间,不能调用peek()方法来看队列中是否有数据元素,因为数据元素只有当你试着取走的时候才可能存在,不取走而只想“偷窥”一下是不行的,当然遍历这个队列的操作也是不允许的。
public class SynchronousQueueTest {
public static void main(String[] args) {
SynchronousQueue<String> queue = new SynchronousQueue<>();
// 以下两个线程,只要有一个没有启动,那么另一个都会阻塞
// 因为SynchronousQueue没有缓存空间,需要put和take配对执行
new Thread(new Runnable() {
@Override
public void run() {
try {
queue.put("c");
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}).start();
new Thread(new Runnable() {
@Override
public void run() {
try {
System.out.println(queue.take());
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}).start();
}
}