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