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