当需要并发访问一个不可修改的Map时,可以使用ConcurrentHashMap替代Collections.unmodifiableMap。ConcurrentHashMap是Java并发包中提供的线程安全的HashMap实现。
下面是一个示例代码:
import java.util.Collections;
import java.util.HashMap;
import java.util.Map;
import java.util.concurrent.ConcurrentHashMap;
public class ConcurrentMapExample {
public static void main(String[] args) {
// 创建一个普通的Map
Map map = new HashMap<>();
map.put("A", 1);
map.put("B", 2);
map.put("C", 3);
// 使用Collections.unmodifiableMap创建一个只读的Map
Map unmodifiableMap = Collections.unmodifiableMap(map);
System.out.println("Read-only Map: " + unmodifiableMap);
// 使用ConcurrentHashMap创建一个线程安全的只读Map
ConcurrentHashMap concurrentMap = new ConcurrentHashMap<>(map);
System.out.println("Concurrent Map: " + concurrentMap);
// 尝试修改普通的Map和只读的Map
map.put("D", 4); // 修改普通的Map是允许的
System.out.println("Modified Map: " + map);
// unmodifiableMap.put("E", 5); // 试图修改只读的Map会抛出UnsupportedOperationException异常
concurrentMap.put("E", 5); // 修改线程安全的只读Map是允许的
System.out.println("Modified Concurrent Map: " + concurrentMap);
}
}
输出结果:
Read-only Map: {A=1, B=2, C=3}
Concurrent Map: {A=1, B=2, C=3}
Modified Map: {A=1, B=2, C=3, D=4}
Modified Concurrent Map: {A=1, B=2, C=3, D=4, E=5}
在上面的示例中,我们首先创建了一个普通的HashMap,并使用Collections.unmodifiableMap方法创建了一个只读的Map。然后,我们使用ConcurrentHashMap的构造函数创建了一个线程安全的只读Map。最后,我们尝试修改这些Map的内容,并观察结果。
注意,尽管ConcurrentHashMap是线程安全的,但它不会对Map的内容进行限制,因此可以修改其中的值。所以,在使用ConcurrentHashMap作为只读Map时,需要注意不要修改其内容。