首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> Java 程式設計 >> Java 程式設計入門

Java 並發隊列深度解析:ArrayBlockingQueue 核心原理與源碼級實現詳解

     編輯:Java 程式設計入門

隊列體系概覽

Java 集合框架提供豐富的隊列實現,按特性分類:

類別特性
ArrayDeque數組雙端隊列,非線程安全
PriorityQueue優先級隊列,非線程安全
ConcurrentLinkedQueue基於鏈表的無界並發隊列
DelayQueue延遲阻塞隊列
ArrayBlockingQueue基於數組的有界阻塞隊列(FIFO)
LinkedBlockingQueue基於鏈表的有界/無界阻塞隊列
LinkedBlockingDeque雙端阻塞隊列
PriorityBlockingQueue帶優先級的無界阻塞隊列
SynchronousQueue零容量同步移交隊列

ArrayBlockingQueue 核心設計

數據結構

  • final E[] items:固定大小數組,存儲元素;
  • int takeIndex:出隊索引(頭部);
  • int putIndex:入隊索引(尾部);
  • int count:當前元素數量;
  • ReentrantLock lock:獨佔鎖,保證線程安全;
  • Condition notEmpty, notFull:等待/通知機制,分別對應消費者、生產者條件。

環形數組邏輯

final int inc(int i) {
    return (++i == items.length) ? 0 : i; // 索引環繞
}

核心操作源碼解析

入隊

private void insert(E x) {
    items[putIndex] = x;
    putIndex = inc(putIndex);
    ++count;
    notEmpty.signal(); // 喚醒消費者
}

出隊

private E extract() {
    E x = items[takeIndex];
    items[takeIndex] = null; // 幫助 GC
    takeIndex = inc(takeIndex);
    --count;
    notFull.signal(); // 喚醒生產者
    return x;
}

公平性策略

構造函數 ArrayBlockingQueue(int capacity, boolean fair) 通過 ReentrantLock(fair) 控制:

  • fair=false(預設):非公平鎖,吞吐量高但可能導致線程飢餓;
  • fair=true:公平鎖,FIFO 獲取鎖,降低吞吐量但避免飢餓。

主要公共方法語義

方法行為阻塞/異常
add(e)插入尾部滿拋 IllegalStateException
offer(e)插入尾部滿返回 false
put(e)插入尾部滿阻塞等待
offer(e, timeout, unit)插入尾部超時返回 false
poll()獲取並移除頭部空返回 null
take()獲取並移除頭部空阻塞等待
poll(timeout, unit)獲取並移除頭部超時返回 null
peek()查看頭部不移除空返回 null

典型應用場景

  • 生產者-消費者模型:固定緩衝區大小,背壓控制;
  • 任務調度緩衝:線程池任務隊列(如 ThreadPoolExecutor 默認使用);
  • 流量削峰填谷:有界隊列防止 OOM,配合拒絕策略保護系統。

性能優化建議

  1. 根據業務峰值預估容量,避免頻繁阻塞或過大浪費內存;
  2. 高併發讀多寫少場景考慮 ConcurrentLinkedQueue(無界、無鎖);
  3. 需優先級處理時改用 PriorityBlockingQueue;
  4. 避免在鎖內執行耗時操作(如 I/O),縮小臨界區。

掌握 ArrayBlockingQueue 的鎖機制、條件變量協作與環形數組設計,能為高併發系統的穩定性與性能調優提供堅實基礎。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved