栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 软件开发 > 后端开发 > Java

队列总结(七)SynchronousQueue

Java 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

队列总结(七)SynchronousQueue

SynchronousQueue
public class SynchronousQueue extends 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的源码,个人感觉有点吃力,暂时放下。

转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/352292.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号