Java
java.util
Arrays
HashSet
TreeSet
Deque
ArrayDeque
ArrayList
LinkedBlockingDeque
Map
HashMap
HashTable
TreeMap
LinkedHashMap
ComputeIfAbsent 在jdk8下的死锁场景
synchronized的锁升级过程
Volatile 关键字
redis 中的Lua脚本
AQS - 从干饭角度解析
ConcurrentHashMap
本文档使用 MrDoc 发布
-
+
首页
LinkedBlockingDeque
## 描述 有界的阻塞双端队列。插入时总插入到尾节点。如果插入数据时节点容量不足,就会阻塞插入,直到有被节点空闲。如果节点为空,取数据的操作也会被阻塞,直到节点容量不为0 容量默认等于 Integer.MAX_VALUE。链接节点在每次插入时动态创建,插入前检查是否会超出容量 在不考虑阻塞的情况下,大部分操作耗时都是一个常量 ## 底层结构 ``` // 双向链表 指向第一个节点的指针 transient Node<E> first; // 双向链表 指向最后一个节点的指针 transient Node<E> last; // 阻塞用锁 final ReentrantLock lock = new ReentrantLock(); // toke取数的等待条件 private final Condition notEmpty = lock.newCondition(); // put存数的等待条件 private final Condition notFull = lock.newCondition(); ``` ## 内部细节 ``` // 内部的插入函数 private boolean linkLast(Node<E> node) { // assert lock.isHeldByCurrentThread(); if (count >= capacity) return false; Node<E> l = last; node.prev = l; last = node; if (first == null) first = node; else l.next = node; ++count; notEmpty.signal(); return true; } // 提供给外部的插入函数,做了阻塞处理 public void putLast(E e) throws InterruptedException { if (e == null) throw new NullPointerException(); Node<E> node = new Node<E>(e); final ReentrantLock lock = this.lock; lock.lock(); try { while (!linkLast(node)) notFull.await(); } finally { lock.unlock(); } } ``` ## 简单使用 参考[Deque](https://coldsmog.cn/project-5/doc-129/)整理的队首队尾API 即可
寒烟濡雨
2022年3月29日 13:45
转发文档
收藏文档
上一篇
下一篇
手机扫码
复制链接
手机扫一扫转发分享
复制链接
关于 MrDoc
觅思文档MrDoc
是
州的先生
开发并开源的在线文档系统,其适合作为个人和小型团队的云笔记、文档和知识库管理工具。
如果觅思文档给你或你的团队带来了帮助,欢迎对作者进行一些打赏捐助,这将有力支持作者持续投入精力更新和维护觅思文档,感谢你的捐助!
>>>捐助鸣谢列表
微信
支付宝
QQ
PayPal
Markdown文件
分享
链接
类型
密码
更新密码