3

Josh Bloch 提到在双重检查习语中使用局部变量可能会提高性能(EJ,第 2 版 p284),并说示例代码在他的机器上运行速度比没有局部变量的速度快 25%。所以问题是,为什么它更快?在局部变量版本的情况下,它访问实例变量 3 次,在正常情况下它访问实例变量 4 次。这是“25%”增长背后的原因还是还有其他原因?

编辑:只有在第一次创建实例时才能访问 3 或 4 次。此后,它是1或2次。

EDIT2:检查此问题的已接受答案以查看示例代码。我认为这是针对 Java 6 的。如何解决 Java 中的“双重检查锁定已损坏”声明?

4

2 回答 2

8

基本的事情是访问volatile变量比访问本地变量要慢。当你声明一个局部变量时,你基本上是在方法中缓存一个 volatile 变量的值。

在正常(没有局部变量)情况下,您正在访问 volatile 变量:

  1. 在第一个子句if之前synchronized
  2. 在第二个子句if里面synchronized
  3. if在您为其分配值的第二个内部
  4. return声明中

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

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

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

于 2012-06-27T08:44:01.783 回答
1

在正常情况下(已经初始化),只有一次读取 volatile 变量(相对昂贵)。我猜在这台机器上,这相当于他看到的减少。使用正常方法(即不使用局部变量),有两个读取(一个用于 the if,一个用于return.)

于 2012-06-27T08:57:00.640 回答