java - 具有并发 put/get 的 EnumMap

标签 java concurrentmodification enum-map

我正在考虑在并发环境中使用 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/

相关文章:

Java 从命令行运行 phantomjs

java - 最终字段的设置方法

java - 使用 java.util.regex.Pattern 在 java 中查找相似的 IP

java - ArrayList 的 isEmpty() 方法出现 ConcurrentModificationException

java - 使用实现接口(interface)的枚举作为 EnumMap 中的参数作为键

java - 查看 Java 中包含的算法的实现细节

java - 在使用 ListIterator 时,我们何时(或何时不允许)允许并发修改?

Java 卡牌游戏与 ArrayList 之战

java - 为什么 EnumMap 为空值分配一个 Object 类对象?

Java - 当枚举本身可以用作映射时为什么要使用 EnumMap?