常用容器对象

作者: jxcyly1985 | 来源:发表于2022-04-07 19:28 被阅读0次

    SynchronousQueue

    SynchronousQueue为什么不设置成capacity空间大小是1的LinkedBlockingQueue?

    1、capacity是1不符合SynchronousQueue的定义要求,SynchronousQueue的空间是0
    只有当存在消费者的时候,即存在 <take>操作时候,offer才能成功

    2、如果capacity空间设置成0, LinkedBlockingQueue的capacity不能设置成0,不符合LinkedBlockingQueue的定义,LinkedBlockingQueue的空间大小必须大于0

    3、SynchronousQueue特点是,当没有consumer端时,offer会失败,这也就是说如果前一个produce的产品没有消费掉,则不能放入新的产品。同样,当没有producer放入产品,consumer端会一直等待。

    LinkedTransferQueue

    为什么有SynchronousQueue,还需要LinkedTransferQueue?
    LinkedTransferQueue为什么不能用capacity大小是Integer.MAX_VALUE的LinkedBlockingQueue代替?

    1、对比SynchronousQueue生产端,put是block方式的,而LinkedTransferQueue是无界容器,producer端可以立即放入返回。

    2、LinkedBlockingQueue的take是堵塞算法,在take的时候需要同步加锁,而LinkedTransferQueue是基于非堵塞算法实现,在可伸缩性上优于LinkedBlockingQueue

    3、LinkedTransferQueue实现了TransferQueue接口,因此可以通过public abstract void transfer (E e)接口等待接收,这个能力是LinkedBlockingQueue所不具备的

    相关文章

      网友评论

        本文标题:常用容器对象

        本文链接:https://www.haomeiwen.com/subject/gspdsrtx.html