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



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

我应该为此担心线程安全性吗?只有一个线程在写入。

一句话 - 是的。

根据实现的不同,putMap可以更改其内部结构,这可能会导致并发get操作具有未定义的行为(例如,对于HashMaps,我见过如果put在中间"中断"它,get永远不会返回的情况)。

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

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

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

确保使用像ConcurrentHashMap这样的并发实现。

最新更新