Josh Bloch提到在双重检查习语中使用局部变量来提高性能(EJ,第2版.p284),并说示例代码在没有局部变量的情况下比他的机器快25%。所以问题是,为什么它更快?在局部变量版本的情况下,它访问实例变量3次,并且在正常情况下它访问实例变量4次。这是“25%”增加背后的原因还是有其他原因?
编辑:仅在首次创建实例时才进行3或4次访问。此后,它是1或2次。
EDIT2:检查此问题的已接受答案以查看示例代码。我认为这适用于Java 6. How to solve the "Double-Checked Locking is Broken" Declaration in Java?
答案 0 :(得分:5)
基本的是访问volatile
变量比访问本地变量要慢。声明局部变量时,基本上缓存方法中的volatile变量的值。
在正常情况下(没有局部变量)情况下,您正在访问volatile变量:
if
子句synchronized
if
子句synchronized
if
内部return
声明中现在,如果您引入局部变量,则只能访问volatile
变量三次:
if
子句synchronized
分配局部变量时
if
子句synchronized
分配局部变量时
if
内部您不会在return
语句中通过返回局部变量来访问它,从而为您提供速度提升。
答案 1 :(得分:1)
在正常情况下(已经初始化),只有一个读取volatile变量(相对昂贵)。我想在这台机器上,这相当于他看到的减少。使用常规方法(即不使用局部变量),有两个读数(一个用于if
,一个用于return
。