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

手寫 Java 隊列類:基於 Vector 實現線程安全的 FIFO 數據結構

     編輯:Java 相關知識

隊列(FIFO)核心操作:入隊、出隊、查首、判空、清空、查找。Java Vector 內建同步、動態擴容、隨機訪問,是構建線程安全隊列的理想基底。本文給出生產級參考實現。

接口定義與異常

public class EmptyQueueException extends RuntimeException {
    public EmptyQueueException() { super("Queue is empty"); }
    public EmptyQueueException(String msg) { super(msg); }
}

public interface Queue {
    void enq(E x);           // 入隊
    E deq();                 // 出隊
    E front();               // 查首不移除
    boolean empty();         // 判空
    void clear();            // 清空
    int search(E x);         // 查找位置(0-based),不存在返回 -1
}

Vector 基礎實現

public class VectorQueue implements Queue {
    private final Vector data = new Vector<>();

    @Override
    public synchronized void enq(E x) {
        data.addElement(x);
    }

    @Override
    public synchronized E deq() {
        if (empty()) throw new EmptyQueueException();
        E x = data.elementAt(0);
        data.removeElementAt(0);
        return x;
    }

    @Override
    public synchronized E front() {
        if (empty()) throw new EmptyQueueException();
        return data.elementAt(0);
    }

    @Override
    public boolean empty() {
        return data.isEmpty();
    }

    @Override
    public synchronized void clear() {
        data.removeAllElements();
    }

    @Override
    public int search(E x) {
        return data.indexOf(x);  // Vector.indexOf 返回 0-based 索引
    }
}

效能與替代方案

實現入隊出隊線程安全備註
Vector/ArrayList + synchronizedO(1) 攤銷O(n) 需位移粗粒度鎖教學/低併發
LinkedList + synchronizedO(1)O(1)粗粒度鎖高頻出隊優選
ArrayDeque (非線程安全)O(1)O(1)無單線程最高性能
ConcurrentLinkedQueueO(1)O(1)無鎖 CAS高併發生產環境首選
ArrayBlockingQueueO(1) 可阻塞O(1) 可阻塞ReentrantLock有界緩衝、生產消費者模式

工程建議

  1. JDK 5+ 優先使用 java.util.concurrent 包:ConcurrentLinkedQueue(無界)、ArrayBlockingQueue(有界)、LinkedBlockingQueue。
  2. 手寫隊列僅用於教學理解、特殊遞歸算法輔助、或極簡環境(無 JUC)。
  3. 若必須自建,優先 LinkedList 做底層,避免 Vector.removeElementAt(0) 的 O(n) 位移開銷。
  4. 異常設計:EmptyQueueException 繼承 RuntimeException,調用方可選捕獲,符合「異常即 Bug」原則。

理解隊列底層實現差異,能在面試、架構選型、性能調優時做出精準決策。生產代碼請直接擁抱 JUC。

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