阻塞队列(2)--LinkedBlockingDeque底层实现

2.1 LinkedBlockingQueue是什么?

1.1 LinkedBlockingQueue是一个阻塞式的队列,继承自AbstractBlockingQueue,间接的实现了Queue接口和Collection接口。底层以链表的形式保存数据(双向链表,如果看过LinkedList的话,本文既不用看了,动态的增删链表长度实现队列)。常用的操作包括 add ,offer,put,remove,poll,take,peek。

1.2 构造函数:

    1. 无参构造,其默认链表最大长度为2^31-1

        public LinkedBlockingDeque();

    2. 用户自定义最大链表长度的有参构造

        public LinkedBlockingDeque(int capacity);

    3. 用户传入集合,将集合中数据保存到链表中,改构造函数为线程安全,使用ReentrantLock锁,其默认链表最大长度为2^31-1

        public LinkedBlockingDeque(Collection<? extends E> c);

1.3 链表结构:

    在LinkedBlockingDeque中有一个Node的子类,该子类主要是存储我们数据,在子类中有三个重要的成员变量,分别是item,prev,next,其中item就是具体存储对象的值,prev是存储上一个元素的值,next存储下一个元素的值,其中prev指向的是上个元素的item值,next指向的是下个元素的item值,这样相互嵌套形成链表,由于通过任意个方向(从上到下或从下打上)都可以获取到元素的值,所以该结构又被成为双向链表;03fc9651e443b9bd2656865e067193ec4cd.jpg

1.4 数据添加:

    1.4.1 add:

        第一步:执行addLast方法,其中addLast调用offerLast方法,如果添加失败会抛出异常

2d2001c8a159792d766fa39f7b294a1ef9b.jpg

675274627abdb5a102195438f248d4f6e6a.jpg

    第二步:获取成员变量中的锁,锁住这个对象,执行linkLast方法

27d8dbb30bcd06ac78827ae08934fb3e2b5.jpg

    第三步:将上一个元素的next执行下一个元素

222a87a4cc80b9a5df1636202294031e3b7.jpg

    1.4.2 offer:

         第一步:和add差不多,不允许添加null值,不过和add方法不同的是,该方法添加失败不会抛出异常

0cc8507a77a78ee92c1bad23f90055b0dd5.jpg

162cba689a1b4d7ff5974db6454168520a8.jpg

    1.4.3 put:

       相对于offer(),如果元素数量与队列长度相等,会阻塞线程,其他的和offer()大致相对

        fd99784685c3531391316a578689d1febe0.jpg

d9ab95c0239d7a50449d9af9a11ca5ecfe1.jpg

1.4.4 push:

       相对于add(),offer(),put(),push()方法是在链表头部进行添加值

9f7adb0c14f6b5bc11abf8beba934848b5c.jpg

6a4264d084b7c21a6270421973d629ab4ff.jpg

3cc13bd7653bc3aace70ddacb621f0836ac.jpg

1ab5584f85c3613419b518ebc58cdfbaa61.jpg

1.5 数据删除:

  1.5.1 remove:和poll()、take()一样从链表头部开始删除数据,不过remove方法如果元素不存在,会抛出异常,poll不会,而take()方法是如果队列为空,其他线程将会阻塞

    770801b18d58c72260095af667f8dcc470c.jpg

转载于:https://my.oschina.net/lovexin/blog/1833738

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值