gpt4 book ai didi

java - ConcurrentHashMap 中的局部引用

转载 作者:行者123 更新时间:2023-11-30 08:49:11 25 4
gpt4 key购买 nike

ConcurrentHashMap 中,segments 被标记为 final(因此永远不会改变),但是 ensureSegment 方法创建了一个方法本地副本 ss操作。

有人知道这个目的吗?我们可以获得哪些好处?

更新:

我从谷歌搜索,得到一页解释 JDK7 中的 ConcurrentHashMap The Concurrency Of ConcurrentHashMap , 以下为摘录

Local References

Even though segments is marked final (and thus will never change), Doug Lea prudently creates a method-local copy, ss, of segments upon which to operate. Such defensive programming allows a programmer to not worry about otherwise-volatile instance member references changing during execution of a method (i.e. inconsistent reads). Of course, this is simply a new reference and does not prevent your method from seeing changes to the referent.

谁能解释一下粗体字?

最佳答案

访问 final 字段和访问保存 final 字段值副本的局部变量之间没有语义差异。但是,在性能关键代码中将字段复制到局部变量是一种既定模式。

即使在没有任何区别的情况下(这取决于 HotSpot 优化器的状态),它也会在方法代码中至少保存一些字节。

每次访问实例字段,无论是 final 还是不是(唯一的异常(exception)是编译时常量),都将被编译为两条指令,首先压入 this 通过 aload_0 引用操作数栈, 然后执行 getfield操作,它有一个指向描述该字段的常量池条目的两字节索引。换句话说,每个字段访问在方法的代码中需要四个字节,而如果变量是方法的前四个之一(将 this 视为局部变量),则读取局部变量只需要一个字节,这里就是这种情况(请参阅 aload_n)。

因此,当一个字段的值将被多次访问时,将其存储在局部变量中是一种很好的行为,可以防止可变变量发生变化,并避免 volatile 读取和即使在 final 字段的情况下它已经过时,它仍然不会受到伤害,因为它甚至会产生更紧凑的字节代码。在简单的解释执行中,即在优化器启动之前,单个局部变量访问可能确实比通过 this 实例绕行更快。

关于java - ConcurrentHashMap 中的局部引用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31560098/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com