当前位置: 首页 > 面试题库 >

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

殳智志
2023-03-14
问题内容

乔什·布洛赫(Josh
Bloch)提到在双重检查惯用语中使用局部变量来提高性能(EJ,第二版,第284页),并说示例代码在其机器上的运行速度比不具有局部变量的机器快25%。所以问题是,为什么速度更快?对于局部变量版本,它将访问实例变量3次,在正常情况下,它将访问实例变量4次。这是“
25%”增长背后的原因还是其他原因?

编辑:3或4倍访问仅在实例首次创建时。此后,它是1或2次。

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


问题答案:

基本的事情是,访问volatile变量比访问本地变量要慢。声明局部变量时,基本上是在方法内部 缓存 易失变量的值。

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

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

现在,如果引入局部变量,则只能访问该volatile变量三次:

  1. 为子句if前的synchronized第一个分配局部变量时
  2. 当第二分配局部变量if里面synchronized条款
  3. 在第二个内部if,您为其分配值

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



 类似资料:
  • 问题内容: 我想知道使用最终局部变量是否有可用性。当继承出现时,变量无论如何都不会被覆盖。例如下面的简单代码 这个例子很简单,可能不是一个相关的代码,但是问题比较笼统。我已经看到了很多代码(全部都包含在具有最终局部变量的main函数中)是否有将局部变量声明为final other的可用性。不能在同一功能中进行编辑? 问题答案: 首先,关于变量被“覆盖”的部分具有两个非常不同的含义。对于类和方法,它

  • 问题内容: 在设计模式手册中,具有双重检查锁定的单例模式已实现如下: 我不明白为什么要使用它。使用不会 违反使用双重检查锁定(即性能)的目的吗? 问题答案: 真正的问题是可能在完成构造之前为其分配存储空间。将看到该作业并尝试使用它。由于使用的是的部分构造版本,因此导致失败。

  • 问题内容: 我偶然遇到了一篇文章,该文章最近讨论了Java中的双重检查锁定模式及其陷阱,现在我想知道我多年来使用的那种模式的变体是否会遇到任何问题。 我看过许多关于该主题的文章和文章,并了解了对部分构造的对象的引用所带来的潜在问题,据我所知,我认为我的实现不受这些问题的影响。以下模式是否有问题? 而且,如果没有,人们为什么不使用它?在围绕此问题进行的任何讨论中,我从未见过推荐它的方法。 问题答案:

  • 问题内容: 我正在学习Python,现在我正在讨论范围和非本地语句。在某个时候,我以为我想通了一切,但是后来非本地人来了,把一切都分解了。 示例1: 运行它自然会失败。 更有趣的是)没有执行。为什么?。 我的理解是,封闭不执行之前执行,并嵌套时,才会执行被调用。我很迷惑… 好,让我们尝试示例2: Aaand …运行良好。哇!!它是如何解决的?功能永远不会执行! 我的理解是,非本地语句是在运行时评估

  • 输出:<代码>编译错误。变量j可能尚未初始化。 为什么会这样呢?

  • 问题内容: 假设您有一个像这样的函数: 而您通常以这种方式使用它: 在这里检查错误的惯用方式是什么?更具体的问题: 如果我们可以假设永远是零,反之亦然? 我们首先要检查什么:(无)或(确认不是零)? 在某些情况下可以是真的吗? 谢谢! 问题答案: 比较 《错误处理编程指南》中从方法返回的处理错误对象: 重要提示: 方法的返回值指示成功或失败。尽管在方法可通过直接返回nil或NO指示失败的情况下,保