阿杰 👍
你问的 Collections.synchronizedMap() 属于 Java 集合框架里的一个线程安全包装方法。我来给你做一个详细解析:


📝 Collections.synchronizedMap() 详解

1. 基本作用

  • 用来将一个 非线程安全的 Map(比如 HashMapTreeMap)包装成 线程安全版本
  • 它会返回一个经过 同步包装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
  • 迭代时必须 外部加锁