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

Java Collections.synchronizedXXX 方法詳解:將非線程安全集合包裝為線程安全

     編輯:程式設計綜合問答

方法作用

Collections.synchronizedList()、synchronizedSet()、synchronizedMap() 等靜態工廠方法,用於將非線程安全的集合(如 ArrayList、HashSet、HashMap)包裝為線程安全的同步視圖。

核心原理

  • 返回一個實現了同步接口的包裝類實例(如 SynchronizedList),內部持有對原集合的引用。
  • 所有公共方法均加 synchronized(mutex) 鎖,默認鎖對象為包裝器自身(this),也可通過構造函數傳入自定義鎖對象。
  • 迭代器不保證線程安全,遍歷時必須手動在包裝器對象上同步。

正確使用示例

List list = Collections.synchronizedList(new ArrayList<>());

// 寫操作自動同步
list.add("thread-safe");

// 讀操作自動同步
String first = list.get(0);

// 遍歷必須手動同步!
synchronized (list) {
    for (String s : list) {
        System.out.println(s);
    }
}

常見誤區

  1. 以為迭代器安全:list.iterator() 返回的迭代器非線程安全,並發修改會拋 ConcurrentModificationException 或數據不一致。
  2. 複合操作非原子:if (!list.contains(x)) list.add(x) 兩步操作間有間隙,需外層同步。
  3. 性能瓶頸:全鎖粒度粗,高併發場景建議用 CopyOnWriteArrayList 或 ConcurrentHashMap。

對比:同步包裝器 vs 並發集合

特性Collections.synchronizedXxxConcurrentHashMap / CopyOnWriteArrayList
實現方式全局鎖包裝分段鎖 / 寫時復制
迭代器安全性需手動同步弱一致性迭代器,無需同步
擴容/擴容性能鎖住整個集合無鎖擴容 / 復制新數組
適用場景低併發、簡單同步高併發、讀多寫少

總結

Collections.synchronizedXXX 是快速將舊代碼集合「升級」為線程安全的便捷手段,但僅保證單個方法調用原子性。複合操作、迭代遍歷仍需開發者手動同步。高併發新項目優先選擇 java.util.concurrent 包下的並發集合。

Collections同步包裝器
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved