【发布时间】:2010-01-15 20:21:04
【问题描述】:
静态初始化的 unmodifiableCollection.get 是否保证不可变?
为:
静态最终地图 FOO = Collections.unmodifiableMap(new HashMap());
可以多线程使用get方法而不遇到问题吗?
即使 FOO 中的项目无法添加/删除,是什么阻止了 get 方法操作 FOO 的内部状态以进行缓存等。如果以任何方式修改内部状态,则 FOO 不能同时使用。如果是这样的话,java中真正的不可变集合在哪里?
【问题讨论】:
-
其实是个好问题。想想
WeakHashMap- 可以改变而不改变。LinkedHashMap在访问顺序模式下是一样的。 -
(您可能希望将问题标题复制到问题中 - 横幅盲区。)
-
作者有个很好的问题。假设我编写了自己的地图实现。让我们假设在每次查找时,它都会重新组织其内部结构,以便下次更快地找到查找次数最多的项目。用户用不可修改的集合包装所述映射并假设它是线程安全的。然后 2 个线程同时访问不同的值,内部优化器搞砸了地图的内部状态。
-
z5h:如果你小心点,你可以吃掉你的蛋糕。我曾经写过一张专家图(用于
ThreadLocal实现),它没有为每个桶提供一个单链表,而是有一个单链循环。如果您错过了命中循环链接中的条目的快速路径,它会将对命中条目的引用写回到数组中。碰巧这是线程安全的。
标签: java collections immutability