• LinkedBlockingQueue 和 ConcurrentLinkedQueue的用法及区别


     


    在 Java 多线程应用中,队列的使用率很高,多数生产消费模型的首选数据结构就是队列(先进先出)。
    Java提供的线程安全的 Queue 可以分为

    • 阻塞队列,典型例子是 LinkedBlockingQueue
      • 适用阻塞队列的好处:多线程操作共同的队列时不需要额外的同步,另外就是队列会自动平衡负载,即那边(生产与消费两边)处理快了就会被阻塞掉,从而减少两边的处理速度差距。
    • 非阻塞队列,典型例子是 ConcurrentLinkedQueue
      • 当许多线程共享访问一个公共集合时,ConcurrentLinkedQueue 是一个恰当的选择。

    LinkedBlockingQueue 多用于任务队列
    ConcurrentLinkedQueue 多用于消息队列

    单生产者,单消费者 用 LinkedBlockingqueue
    多生产者,单消费者 用 LinkedBlockingqueue
    单生产者 ,多消费者 用 ConcurrentLinkedQueue
    多生产者 ,多消费者 用 ConcurrentLinkedQueue

    LinkedBlockingQueue

    由于 LinkedBlockingQueue 实现是线程安全的,实现了先进先出等特性,是作为生产者消费者的首选,LinkedBlockingQueue 可以指定容量,也可以不指定,不指定的话,默认最大是 Integer.MAX_VALUE

    • void put(E e): 在队尾插入元素,方法在队列满的时候会阻塞直到有队列成员被消费
    • boolean offer(E e): 在队尾插入元素,方法在队列满的时候不会阻塞,直接返回 false
    • E take(): 取出并删除队列中的首元素,如果队列为空,会阻塞,直到有队列成员被放进来
    • E poll(): 取出并删除队列中的首元素,如果队列为空,则返回 null,不进行阻塞
    • E peek(): 取出第一个元素但是不删除它,没有就返回 null

    具体使用参见 Java 通过阻塞队列实现生产者消费者模式

    ConcurrentLinkedQueue

    ConcurrentLinkedQueue 是 Queue 的一个安全实现。Queue 中元素按 FIFO 原则进行排序。采用 CAS操作,来保证元素的一致性。

      • boolean offer(E e): 在队尾插入元素,不进行阻塞
      • E poll(): 取出并删除队列中的首元素,不进行阻塞
      • E peek(): 取出第一个元素但是不删除它,不进行阻塞
      • 并发队列ConcurrentLinkedQueue、阻塞队列AraayBlockingQueue、阻塞队列LinkedBlockingQueue 区别 和 使用场景总结
        者 都是线程安全的。区别,就是 并发 和 阻塞,前者为并发队列,因为采用cas算法,所以能够高并发的处理;后2者采用锁机制,所以是阻塞的。
        后2者区别:联系,第2和第3都是阻塞队列,都是采用锁,都有阻塞容器Condition,通过Condition阻塞容量为空时的取操作和容量满时的写操作第。
        区别,第2就一个整锁,第3是2个锁,所以第2第3的锁机制不一样,第3比第2吞吐量 大,并发性能也比第2高。

  • 相关阅读:
    896. Monotonic Array单调数组
    865. Smallest Subtree with all the Deepest Nodes 有最深节点的最小子树
    489. Robot Room Cleaner扫地机器人
    JavaFX
    《Python CookBook2》 第一章 文本
    《Python CookBook2》 第一章 文本
    《Python CookBook2》 第一章 文本
    《Python CookBook2》 第一章 文本
    《Python CookBook2》 第一章 文本
    《Python CookBook2》 第一章 文本
  • 原文地址:https://www.cnblogs.com/zyy1688/p/12175640.html
Copyright © 2020-2023  润新知