为什么“下一个”是“下一个”? ConcurrentHashMap$HashEntry 中的字段是最终的
我正在阅读 java.util.ConcurrentHashMap 的源代码,发现 ConcurrentHashMap$HashEntry 中的 next
字段是最终的。有两种操作可以修改 next
的值:添加和删除。但这两个操作可以安全地线程完成,即使 next 字段不是最终的。所以我不明白为什么 next
字段是最终的,有人能告诉我为什么吗?谢谢。
I'm reading reading the source code of java.util.ConcurrentHashMap and find that the next
field in ConcurrentHashMap$HashEntry is final. There are two operations that is possible to modify the value of next
:add and remove. But those two operations cat be done thread safely even though the next
field is not final. So I cann't understand why the next
field is final, can anyone tell me why? thanks.
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(1)
需要
next
上的final
来确保读取线程看到字段的初始化值,因为(大多数)读取ConcurrentHashMap
是在没有同步的情况下进行的。请注意,例如,
value
不是final
,因此读取线程可以在该字段中看到未初始化的值 (null
),并且在这种情况下必须在同步下重新检查它:final
onnext
is needed to ensure that reading threads see the initialized value of the field, because (most of) reads ofConcurrentHashMap
happen without synchronization.Note that, for example,
value
is notfinal
, therefore reading thread can see a non-initialized value (null
) in that field, and have to recheck it under synchronization in that case: