[TOC]
> 本文視頻講解:https://www.bilibili.com/video/BV1Lb4y1d7L7
## 什么是阻塞隊列
阻塞隊列是一個在隊列基礎上又支持了兩個附加操作的隊列,常應用于解耦。
兩個附加操作:
1. 支持阻塞的插入方法:隊列滿時,隊列會阻塞插入元素的線程,直到隊列不滿。
2. 支持阻塞的移除方法:隊列空時,獲取元素的線程會等待隊列變為非空。
阻塞隊列是哪里用到的?阻塞隊列是線程池的自定義參數之一。<br>
和JDK集合包中的Queue接兼容,同時在其基礎上增加了阻塞功能。
定義的接口,而pu(.)是阻塞的。
### 說一下JUC中BlockingQueue接口主要的方法和特點?
條件:
notEmpty:非空狀態,take()線程可以在隊列中取數據;
notFull:未滿裝填,put()線程可以在隊列中放數據;
#### 說一說BlockingQueue常 用的實現類?
**說一下ArrayBlockingQueue的設計?**
> 一個對象數組 + 一把鎖 + 兩個條件
是一個用數組實現的有界阻塞隊列,此隊列按照先進先出(FIFO)的原則對元素進行排序。支持公平鎖和非公平鎖。
1. ArrayBlockingQueue是一個用數組實現的環形隊列,在構造方法中,會要求傳入數組的容量。
2. 入隊與出隊都用同一把鎖只有入隊高并發或出隊高并發的情況下,操作數組不需要擴容,性能很高。
> 注:每一個線程在獲取鎖的時候可能都會排隊等待,如果在等待時間上,先獲取鎖的線程的請求一定先被滿足,那么這個鎖就是公平的。反之,這個鎖就是不公平的。公平的獲取鎖,也就是當前等待時間最長的線程先獲取鎖
##### 說一下LinkedBlockingQueue的設計?
```
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 */
private final ReentrantLock putLock = new ReentrantLock();
/** Wait queue for waiting puts */
private final Condition notFull = putLock.newCondition();
……
}
```
- 兩把鎖:put()操作和take()操作,分別對應一把鎖,本質上操作的是Node對象;
- 相互通知:put()線程未滿,通知其他put()線程,會通知take()線程;
##### 說-下PriorityBlockingQueue的設計?
#### SynchronousQueue

SynchronousQueue: 一個不存儲元素的阻塞隊列,每一個put()操作必須等待take()操作,否則不能添加元素。支持公平鎖和非公平鎖。SynchronousQueue的一個使用場景是在線程池里。Executors.newCachedThreadPool()就使用了SynchronousQueue,這個線程池根據需要(新任務到來時)創建新的線程,如果有空閑線程則會重復使用,線程空閑了60秒后會被回收。
### 應用場景
## 總結

- 前言
- 第一部分 計算機網絡與操作系統
- 大量的 TIME_WAIT 狀態 TCP 連接,對業務有什么影響?怎么處理?
- 性能占用
- 第二部分 Java基礎
- 2-1 JVM
- JVM整體結構
- 方法區
- JVM的生命周期
- 堆對象結構
- 垃圾回收
- 調優案例
- 類加載機制
- 執行引擎
- 類文件結構
- 2-2 多線程
- 線程狀態
- 鎖與阻塞
- 悲觀鎖與樂觀鎖
- 阻塞隊列
- ConcurrentHashMap
- 線程池
- 線程框架
- 徹底搞懂AQS
- 2-3 Spring框架基礎
- Spring注解
- Spring IoC 和 AOP 的理解
- Spring工作原理
- 2-4 集合框架
- 死磕HashMap
- 第三部分 高級編程
- Socket與NIO
- 緩沖區
- Bybuffer
- BIO、NIO、AIO
- Netty的工作原理
- Netty高性能原因
- Rabbitmq
- mq消息可靠性是怎么保障的?
- 認證授權
- 第四部分 數據存儲
- 第1章 mysql篇
- MySQL主從一致性
- Mysql的數據組織方式
- Mysql性能優化
- 數據庫中的樂觀鎖與悲觀鎖
- 深度分頁
- 從一條SQL語句看Mysql的工作流程
- 第2章 Redis
- Redis緩存
- redis key過期策略
- 數據持久化
- 基于Redis分布式鎖的實現
- Redis高可用
- 第3章 Elasticsearch
- 全文查詢為什么快
- battle with mysql
- 第五部分 數據結構與算法
- 常見算法題
- 基于數組實現的一個隊列
- 第六部分 真實面試案例
- 初級開發面試材料
- 答案部分
- 現場編碼
- 第七部分 面試官角度
- 第八部分 計算機基礎
- 第九部分 微服務
- OpenFeign工作原理