Java基础学习之并发篇:LinkedBlockingQueue和LinkedBlockingDeque

本文介绍了Java并发编程中的两种阻塞队列:LinkedBlockingQueue和LinkedBlockingDeque。LinkedBlockingQueue基于单链表实现,使用两个锁分别处理生产和消费,而LinkedBlockingDeque作为双端队列,提供了更高的并发性能。两者都实现了BlockingQueue接口,允许在队列满或空时阻塞线程。LinkedBlockingDeque还额外实现了BlockingDeque接口,提供了更多的头部和尾部操作。
摘要由CSDN通过智能技术生成

学习目标

在并发编程中,阻塞队列在多线程中的场景特别有用,比如在生产和消费者模型中,生产者生产数据到队列,队列满时需要阻塞线程,停止往队列生产。消费者消费队列,对队列为空时阻塞线程停止消费,在Java中有提供不同场景的阻塞队列,那么接下来我们将学习:LinkedBlockingQueueLinkedBlockingDeque两种阻塞队列。


LinkedBlockingQueue

上次我们学习了基础的有界阻塞队列ArrayBlockingQueue👉有兴趣可以了解下,明白了有界阻塞队列基本实现原理,而LinkedBlockingQueue与ArrayBlockingQueue比较而言,我们知道ArrayBlockingQueue是通过一个有界的数组对象来存储数据,而LinkedBlockingQueue是用了单链表来实现数据的存储,且相较于ArrayBlockingQueue是用两个锁分别来处理数据的生产和消费。实现类如下:

public class LinkedBlockingQueue<E> extends AbstractQueue<E>
        implements BlockingQueue<E>, java.io.Serializable {
   

    /** The capacity bound, or Integer.MAX_VALUE if none */
    private final int capacity;

    /** Current number of elements */
    private final AtomicInteger count = new AtomicInteger();

    /**
     * Head of linked list.
     * Invariant: head.item == null
     */
    transient Node<E> head;

    /**
     * Tail of linked list.
     * Invariant: last.next == null
     */
    private transient Node<E> last;

    /** Lock held by take, poll, etc */
    private final ReentrantLock takeLock = new ReentrantLock();

    /** Wait queue for waiting takes */
    private final Condition notEmpty = takeLock.newCondition();

    /** Lock held by put, offer, etc */<
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值