我正在考虑在并发环境中使用 EnumMap
。然而,环境是非典型的,原因如下:
EnumMap
总是满的:当映射暴露给并发环境时没有未映射的键- 只会使用
put()
和get()
操作(没有迭代,没有remove()
等) - 如果对
get()
的调用没有立即或有序地反射(reflect)对put()
的调用,这是完全可以接受的。
据我所知,包括相关的方法源代码,这似乎是一个安全的场景(与允许迭代不同)。有什么我可能忽略的吗?
最佳答案
一般来说,跨线程使用非线程安全的类会带来很多问题。在您的特定情况下,假设在所有键都已分配值后安全发布(例如 map.size() == TheEnum.values().length
),我可以从 quickish 中看到的唯一问题一览EnumMap
's code in Java 1.6 put
可能永远 不会反射(reflect)在另一个线程中。但这仅是因为 EnumMap
实现的内部结构,将来可能会发生变化。换句话说, future 的变化可能会以更危险、更微妙的方式破坏用例。
编写仍然包含数据竞争的正确代码是可能的——但这很棘手。为什么不将实例包装在 Collections.synchronizedMap
中?
关于java - 具有并发 put/get 的 EnumMap,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21257104/