可能的重复:
懒瓦尔的(隐藏)成本是多少? (Scala)

Scala允许定义懒值

lazy val maybeUnusedValue = someCostlyInitialization

在哪里 someCostlyInitialization 仅首次使用 maybeUnusedValue. 。也就是说,它最多一次进行评估,如果 maybeUnusedValue 从未使用过,也从未对其进行评估。

这个线程安全吗?这有什么影响?如果要进行螺纹安全,则必须以某种方式使用某种同步 /使用Java挥发性。不幸的是 Scala语言规范 什么也没说。

有帮助吗?

解决方案

它是使用双检查锁定的线程安全的 http://code-o-matic.blogspot.com/2009/05/double-checked-locking-idiom-sweet-in.html 显然,这确实意味着访问懒惰的阀比非懒惰的阀要慢。

其他提示

更新:正如瓦西尔(Vasil)指出的那样,糟糕,问题是另一个线程的副本,正如它发生的那样,答案也是如此。

我上了这堂课:

class Foo {
  lazy val test = "hi"
}

编译并分解(与JD-GUI):

public class Foo
  implements ScalaObject
{
  private String test;
  public volatile int bitmap$0;

  public String test()
  {
    if (
      (this.bitmap$0 & 0x1) == 0);
    synchronized (this)
    {
      if (
        (this.bitmap$0 & 0x1) == 0) {
        this.test = "hi"; this.bitmap$0 |= 1; } return this.test;
    }
  }
}

如您所见,它正在使用带有挥发性变量的双检查范式。所以我认为这是安全的

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top