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

Java 多線程同步容器深度解析:從 Vector 到 ConcurrentHashMap

     編輯:Java 綜合教學

同步容器的演進與核心缺陷

Java 集合框架中,ArrayList、LinkedList、HashMap 等主流容器均為非線程安全。早期 Java 提供了同步容器解決並發問題,但隨著並發需求增長,其性能瓶頸與安全隱患逐漸暴露,催生了 JUC 並發包的誕生。

第一代同步容器

容器對應非線程安全版本實現機制
VectorArrayList所有方法 synchronized
StackVector 子類繼承 Vector 同步特性
HashtableHashMap所有方法 synchronized

Collections 工廠方法創建的同步包裝器

List<String> syncList = Collections.synchronizedList(new ArrayList<>());
Map<String, String> syncMap = Collections.synchronizedMap(new HashMap<>());
Set<String> syncSet = Collections.synchronizedSet(new HashSet<>());

本質:通過裝飾器模式,用互斥鎖包裝每個方法調用。

同步容器的致命缺陷:複合操作非原子

單個方法雖然同步,但「檢查-然後執行」等複合操作仍不安全:

// 線程不安全示例:遍歷時刪除
for (int i = 0; i < vector.size(); i++) {
    vector.remove(i);  // size() 與 remove() 非原子,拋 ConcurrentModificationException
}

解決方案:客戶端加鎖(擴展同步塊)

synchronized (vector) {
    for (int i = 0; i < vector.size(); i++) {
        vector.remove(i);
    }
}

迭代器失效機制源碼解析

ArrayList 迭代器通過 modCount 檢測並發修改:

  • expectedModCount:創建迭代器時記錄的修改計數
  • modCount:每次 add/remove 遞增
  • 不一致時拋出 ConcurrentModificationException

JDK 5+ 並發容器:性能與安全的平衡

ConcurrentHashMap:分段鎖/ CAS + synchronized

  • 讀操作無鎖(volatile 保證可見性)
  • 寫操作細粒度鎖(JDK 7 分段鎖,JDK 8 CAS + synchronized + 紅黑樹)
  • 性能遠超 Hashtable

CopyOnWriteArrayList:讀寫分離極致

核心思想:寫時復制,讀操作無鎖,寫操作復制新數組

適用場景:黑白名單、配置變更監聽、事件總線監聽器管理

最佳實踐建議

  1. 高並發讀寫:優先 ConcurrentHashMap、ConcurrentLinkedQueue
  2. 讀多寫少、需遍歷:CopyOnWriteArrayList/Set
  3. 避免在同步容器上進行複合操作,或使用客戶端加鎖
  4. 單線程環境:優先非線程安全容器 + 外部同步
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved
優點缺點
讀性能極佳,適合讀多寫少內存佔用大(雙份數組)
迭代器不拋 ConcurrentModificationException只能保證最終一致性,非實時