我有一个可以从多个Java类实例访问的Map<Sting, List<Object>>
。此Map
有时会由单独的线程更新。实例从不写入任何对象。他们只是获取其中一个List
并读取其中的对象。
我应该为此担心线程安全性吗?只有一个线程在写入。
一句话 - 是的。
根据实现的不同,put
Map
可以更改其内部结构,这可能会导致并发get
操作具有未定义的行为(例如,对于HashMap
s,我见过如果put
在中间"中断"它,get
永远不会返回的情况)。
应使用线程安全的Map
实现,例如ConcurrentHashMap
。
是的。请注意,Map 是一个接口,而不是一个实现。几个 Map 方法的文档提到:
默认实现不保证此方法的同步或原子性属性。任何提供原子性保证的实现都必须重写此方法并记录其并发属性。
确保使用像ConcurrentHashMap这样的并发实现。