多个 Java class 实例同时读取同一个 Map 是否存在线程安全问题?

Is there a thread safety issue with multiple Java class instances reading the same Map simultaneously?

我有一个 Map<Sting, List<Object>> 可以从多个 Java class 实例访问。这个 Map 有时会由一个单独的线程偶尔更新一次。实例从不写入任何对象。他们只是获取其中一个 List 并读取其中的对象。

我是否应该为此担心线程安全?只有一个线程在写。

是的。注意 Map 是一个接口,而不是一个实现。几种Map方法的文档提到:

默认实现不保证此方法的同步或原子性属性。任何提供原子性保证的实现都必须覆盖此方法并记录其并发属性。

确保使用像 ConcurrentHashMap.

这样的并发实现

一句话-是的。

根据实现,putMap 可以更改其内部结构,这可能会导致并发 get 操作具有未定义的行为(例如,使用 HashMaps,我见过 get 从未 returns 如果 put 在中间“中断”它的情况。

您应该使用线程安全的 Map 实现,例如 ConcurrentHashMap.