Java:在双重检查成语中使用局部变量

标签 java

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 变量:

  1. synchronized 子句之前的第一个 if
  2. synchronized 子句中的第二个 if
  3. 在第二个 if 中,您为其赋值
  4. return语句中

现在,如果你引入一个局部变量,你只需要访问 volatile 变量 3 次:

  1. synchronized 子句之前的第一个if 分配局部变量时
  2. synchronized 子句中的第二个 if 分配局部变量时
  3. 在第二个 if 中,您为其赋值

通过返回局部变量,您无需在 return 语句中访问它,从而提高速度。

关于Java:在双重检查成语中使用局部变量,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11222291/

相关文章:

java - 在 Java 中读取 Excel 文件 (.xls)

java - 如果输入与 java 中对象数组中的元素匹配,则返回一个值

java - ejb获取当前正在执行的bean

java - 如何在android中的 Activity 之间传递 boolean 值?

java - 使用正则表达式codingBat splitThousands(以及单元测试方法)

java - 使用 JQuery 将值设置为输入类型复选框

java - 如何找到以下代码的最坏情况复杂度?

java - KeyEvent 不理解 ENTER 键

java - Kotlin 日期解析无法正常工作

java - Mac OSX El Capitan 上的 OpenGL 3.3 和 LWJGL