我正在考虑在并发环境中使用EnumMap。但是,环境是非典型的,原因如下:
EnumMap总是满的:当地图暴露于并发环境时,没有未映射的键
仅将使用put()和get()操作(不进行迭代,不执行remove()等)
如果get()不立即/有序地反映put(),则完全可以接受
从我所能收集的资料(包括相关的方法源代码)来看,这似乎是一个安全的方案(与是否允许迭代不同)。有什么我可能会忽略的吗?
最佳答案
通常,跨线程使用非线程安全类会遇到很多问题。在您的特定情况下,假设在为所有键分配了值之后(例如map.size() == TheEnum.values().length
)进行安全发布,那么从EnumMap
's code in Java 1.6一眼就能看出的唯一问题是put
可能永远不会在另一个线。但这是真的,因为EnumMap
的实现内部可能会在将来发生变化。换句话说,将来的更改可能以更危险,更微妙的方式破坏用例。
可以编写仍然包含数据竞争的正确代码-但这很棘手。为什么不将实例包装在Collections.synchronizedMap
中呢?
关于java - 具有并发放置/获取的EnumMap,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/21257104/