Java 为什么会有";“下一步”;ConcurrentHashMap$HashEntry中的字段是最终字段

Java 为什么会有";“下一步”;ConcurrentHashMap$HashEntry中的字段是最终字段,java,concurrenthashmap,java.util.concurrent,Java,Concurrenthashmap,Java.util.concurrent,我正在阅读java.util.ConcurrentHashMap的源代码,发现ConcurrentHashMap$HashEntry中的next字段是最终字段。有两种操作可以修改next的值:添加和删除。但是,即使next字段不是最终字段,这两个操作也可以通过线程安全地完成。所以我不明白为什么next字段是final,有人能告诉我为什么吗?谢谢。finalonnext需要确保读取线程看到字段的初始化值,因为(大多数)读取ConcurrentHashMap时没有同步 请注意,例如,value不是f

我正在阅读java.util.ConcurrentHashMap的源代码,发现ConcurrentHashMap$HashEntry中的
next
字段是最终字段。有两种操作可以修改
next
的值:添加和删除。但是,即使
next
字段不是最终字段,这两个操作也可以通过线程安全地完成。所以我不明白为什么
next
字段是final,有人能告诉我为什么吗?谢谢。

final
on
next
需要确保读取线程看到字段的初始化值,因为(大多数)读取
ConcurrentHashMap
时没有同步

请注意,例如,
value
不是
final
,因此读取线程可以在该字段中看到未初始化的值(
null
),在这种情况下,必须在同步下重新检查该值:

    V get(Object key, int hash) {
        if (count != 0) { // read-volatile
            HashEntry<K,V> e = getFirst(hash);
            while (e != null) {
                if (e.hash == hash && key.equals(e.key)) {
                    V v = e.value;
                    if (v != null)
                        return v;
                    return readValueUnderLock(e); // recheck
                }
                e = e.next;
            }
        }
        return null;
    }
vget(对象键,int散列){
如果(计数!=0){//read volatile
HashEntry e=getFirst(哈希);
while(e!=null){
如果(e.hash==hash&&key.equals(e.key)){
V=e值;
如果(v!=null)
返回v;
返回readValueUnderLock(e);//重新检查
}
e=e.next;
}
}
返回null;
}

final
on
next
需要确保读取线程看到字段的初始化值,因为(大多数)读取
ConcurrentHashMap
时没有同步

请注意,例如,
value
不是
final
,因此读取线程可以在该字段中看到未初始化的值(
null
),在这种情况下,必须在同步下重新检查该值:

    V get(Object key, int hash) {
        if (count != 0) { // read-volatile
            HashEntry<K,V> e = getFirst(hash);
            while (e != null) {
                if (e.hash == hash && key.equals(e.key)) {
                    V v = e.value;
                    if (v != null)
                        return v;
                    return readValueUnderLock(e); // recheck
                }
                e = e.next;
            }
        }
        return null;
    }
vget(对象键,int散列){
如果(计数!=0){//read volatile
HashEntry e=getFirst(哈希);
while(e!=null){
如果(e.hash==hash&&key.equals(e.key)){
V=e值;
如果(v!=null)
返回v;
返回readValueUnderLock(e);//重新检查
}
e=e.next;
}
}
返回null;
}

所以,final通过读取线程确保字段的初始化值被正确看到。但为什么HashEntry类本身在ConcurrentHashMap中是final呢?所以,final通过读取线程来确保字段的初始化值是正确的。但为什么HashEntry类本身在ConcurrentHashMap中是最终的呢?