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?
最佳答案
最基本的是访问volatile
变量比访问本地变量慢。当您声明一个局部变量时,您基本上是在方法中缓存一个 volatile 变量的值。
在正常情况下(没有局部变量),您正在访问 volatile 变量:
- 在
synchronized
子句之前的第一个if
- 在
synchronized
子句中的第二个if
- 在第二个
if
中,您为其赋值 - 在
return
语句中
现在,如果你引入一个局部变量,你只需要访问 volatile
变量 3 次:
- 为
synchronized
子句之前的第一个if
分配局部变量时 - 为
synchronized
子句中的第二个if
分配局部变量时 - 在第二个
if
中,您为其赋值
通过返回局部变量,您无需在 return
语句中访问它,从而提高速度。
关于Java:在双重检查成语中使用局部变量,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11222291/