阿杰 👍
你问的 Collections.synchronizedMap()
属于 Java 集合框架里的一个线程安全包装方法。我来给你做一个详细解析:
📝 Collections.synchronizedMap()
详解
1. 基本作用
- 用来将一个 非线程安全的 Map(比如
HashMap
、TreeMap
)包装成 线程安全版本。 - 它会返回一个经过 同步包装 的
Map
,保证在多线程环境下多个线程安全访问。
👉 原型:
public static <K,V> Map<K,V> synchronizedMap(Map<K,V> m)
2. 基本用法
import java.util.*;
public class SyncMapDemo {
public static void main(String[] args) {
Map<String, String> map = new HashMap<>();
Map<String, String> syncMap = Collections.synchronizedMap(map);
syncMap.put("A", "阿杰");
syncMap.put("B", "小明");
System.out.println(syncMap.get("A"));
}
}
输出:
阿杰
3. 注意事项
(1) 迭代时必须手动同步
虽然单个操作(如 put/get/remove
)是线程安全的,但 遍历(iteration) 时必须额外加锁:
synchronized(syncMap) {
for (Map.Entry<String, String> entry : syncMap.entrySet()) {
System.out.println(entry.getKey() + " -> " + entry.getValue());
}
}
否则可能抛出 ConcurrentModificationException
。
(2) 与 ConcurrentHashMap 的区别
特性 | Collections.synchronizedMap() | ConcurrentHashMap |
---|---|---|
同步方式 | 整个 Map 加锁 (synchronized) | 分段锁 / CAS,无需整体锁 |
性能 | 多线程下性能差 | 高并发性能好 |
迭代 | 必须手动 synchronized | 弱一致性迭代器,支持并发迭代 |
适用场景 | 低并发、小规模多线程 | 高并发场景 |
4. 常见的线程安全集合包装
Collections.synchronizedList(List<T> list)
Collections.synchronizedSet(Set<T> s)
Collections.synchronizedMap(Map<K,V> m)
5. 小结
Collections.synchronizedMap()
适合 简单多线程、低并发场景。- 如果是 高并发,推荐用
ConcurrentHashMap
。 - 迭代时必须 外部加锁。
发表回复