目 录CONTENT

文章目录

LinkedBlockingDeque - 链式双向阻塞队列

FatFish1
2024-10-24 / 0 评论 / 0 点赞 / 60 阅读 / 0 字 / 正在检测是否收录...

概述

LinkedBlockingDeque是一个由链表结构组成的双向阻塞队列,即可以从队列的两端插入和移除元素。双向队列因为多了一个操作队列的入口,在多线程同时入队时,也就减少了一半的竞争

相比于其他阻塞队列,LinkedBlockingDeque多了addFirst、addLast、peekFirst、peekLast等方法,以first结尾的方法,表示插入、获取获移除双端队列的第一个元素。以last结尾的方法,表示插入、获取获移除双端队列的最后一个元素。

LinkedBlockingDeque是可选容量的,在初始化时可以设置容量防止其过度膨胀,如果不设置,默认容量大小为Integer.MAX_VALUE。

源码分析

成员变量node

LinkedBlockingDeque的node结构比LinkedBlockingQueue就复杂一点:

    static final class Node<E> {
        E item;
        Node<E> prev;
        Node<E> next;
        Node(E x) {
            item = x;
        }
    }

一个表示本身的item,一个前驱,一个后继

takeFirst - 阻塞方法

while ( (x = unlinkFirst()) == null) {
    notEmpty.await();
}

核心在这一部分,这里取第一个为空时,notEmpty是一个Condition,执行await进入等待状态,等待signal

pollFirst

是一个具有周期性请求能力的阻塞方法

while ((x = unlinkFirst()) == null) {
    if (nanos <= 0) {
        return null;
    }
    nanos = notEmpty.awaitNanos(nanos);
}

这里比take多了一个awaitNanos,这里的Condition等待一定时间会自动唤醒,重复while流程

0

评论区