【发布时间】:2015-07-15 12:05:08
【问题描述】:
在 JDK 1.6 中,Doug Lea 在 next 字段之前使用 final。
static final class HashEntry<K,V> {
final K key;
final int hash;
volatile V value;
final HashEntry<K,V> next;
而在 JDK 1.7 中,next 字段前面是 volatile。我还注意到,在 JDK 1.7 中,get 方法采用getObjectVolatile 方法来读取value 字段,该字段具有可变负载语义。
我不明白为什么 Doug Lea 以前使用 final。如果正确性有问题,那他怎么能在JDK 1.7(也是JDK 1.8)中用volatile代替呢?
编辑:
具体来说,我的问题是,我们能否在 JDK 1.6 的实现中将 final 替换为 volatile?
【问题讨论】:
-
这个类不在 Java 8 的 CHM 中。
-
好的,如果这是你的问题,那么不,你不能。修改器改变的原因是实现完全改变了。这不是一个孤立的变化。
-
@RealSkeptic,你能提供一些细节或文章来解释吗?谢谢。
-
@assylias,对不起,整个实现在 Java 8 中发生了变化,它使用
Node<K,V>表示键值条目。我应该指出来。
标签: java concurrency hashmap java.util.concurrent concurrenthashmap