斯卡拉懒惰值:性能惩罚?线程?

Han*_*örr 13 performance scala lazy-initialization

可能重复:
lazy val的(隐藏)成本是多少?(斯卡拉)

Scala允许定义惰性值

lazy val maybeUnusedValue = someCostlyInitialization
Run Code Online (Sandbox Code Playgroud)

where someCostlyInitialization仅在第一次使用时评估maybeUnusedValue.也就是说,它最多被评估一次,如果maybeUnusedValue从未使用过,它也从未被评估过.

这线程安全吗?这有什么性能影响?如果这是线程安全的,它必须以某种方式使用某种同步/使用Java volatile.不幸的是,Scala语言规范对此没有任何说明.

Ale*_*nov 12

使用双重检查锁定使其成为线程安全的http://code-o-matic.blogspot.com/2009/05/double-checked-locking-idiom-sweet-in.html显然这意味着访问延迟的vals比非懒惰慢.


Itt*_*ayD 7

更新:OOPS,正如Vasil指出的那样,问题是另一个线程的副本,当它发生时,这个答案也是如此.

我上了这堂课:

class Foo {
  lazy val test = "hi"
}
Run Code Online (Sandbox Code Playgroud)

编译和反编译(与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;
    }
  }
}
Run Code Online (Sandbox Code Playgroud)

正如您所看到的那样,它使用带有volatile变量的双重检查范例.所以我认为这是安全的