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);
}
}
list.iterator() 返回的迭代器非線程安全,並發修改會拋 ConcurrentModificationException 或數據不一致。if (!list.contains(x)) list.add(x) 兩步操作間有間隙,需外層同步。CopyOnWriteArrayList 或 ConcurrentHashMap。| 特性 | Collections.synchronizedXxx | ConcurrentHashMap / CopyOnWriteArrayList |
|---|---|---|
| 實現方式 | 全局鎖包裝 | 分段鎖 / 寫時復制 |
| 迭代器安全性 | 需手動同步 | 弱一致性迭代器,無需同步 |
| 擴容/擴容性能 | 鎖住整個集合 | 無鎖擴容 / 復制新數組 |
| 適用場景 | 低併發、簡單同步 | 高併發、讀多寫少 |
Collections.synchronizedXXX 是快速將舊代碼集合「升級」為線程安全的便捷手段,但僅保證單個方法調用原子性。複合操作、迭代遍歷仍需開發者手動同步。高併發新項目優先選擇 java.util.concurrent 包下的並發集合。