Collections.synchronizedMap通过synchronized关键字为普通Map提供线程安全,适用于读多写少场景,但遍历时需手动加锁,且性能较低,高并发下推荐使用ConcurrentHashMap。
在多线程环境下操作Map时,如果使用普通的HashMap可能会导致数据不一致或并发修改异常。Java提供了多种方式来保证Map的线程安全,其中一种经典方法是使用 Collections.synchronizedMap 来包装普通Map,使其具备基本的线程安全性。
基本用法如下:
Mapmap = new HashMap<>(); Map syncMap = Collections.synchronizedMap(map);
也可以直接写成一行:
MapsyncMap = Collections.synchronizedMap(new HashMap ());
正确遍历方式如下:
Map如果不加 synchronized 块,即使 map 是 synchronizedMap,也有可能在迭代过程中被其他线程修改,导致异常。syncMap = Collections.synchronizedMap(new HashMap ()); // 遍历时必须使用同步块 synchronized (syncMap) { for (Map.Entry entry : syncMap.entrySet()) { System.out.println(entry.getKey() + " = " + entry.getValue()); } }
以下几点:
示例:安全地检查并添加元素
synchronized (syncMap) {
if (!syncMap.containsKey("key1")) {
syncMap.put("key1", 100);
}
}
基本上就这些。Collections.synchronizedMap 能快速为 Map 提供线程安全能力,但要注意其同步限制和性能瓶颈。合理使用同步块,才能真正保障多线程下的数据一致性。