SynchronousQueue

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 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();
    }

}

 

你可能感兴趣的:(Java)