Scala ленивые значения: штраф за производительность? THREADSAFE?

Возможный дубликат:
Какова (скрытая) стоимость ленивого val? (Scala)

Scala позволяет определять ленивые значения

lazy val maybeUnusedValue = someCostlyInitialization

где someCostlyInitialization оценивается только при первом использовании maybeUnusedValue. То есть, он оценивается не более одного раза, и если maybeUnusedValue никогда не используется, он также никогда не оценивается вообще.

Является ли это потокобезопасным? Каковы последствия этого? Если это должно быть потокобезопасным, он должен каким-то образом использовать какую-то синхронизацию/использование Java volatile. К сожалению, Scala спецификация языка ничего не говорит об этом.

Ответы

Ответ 2

UPDATE: OOPS, как заметил Василь, вопрос - это копия другого потока, и, как это бывает, так и этот ответ.

Я взял этот класс:

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;
    }
  }
}

Как вы видите, это использование парадигмы двойной проверки с изменчивой переменной. Поэтому я думаю, что это безопасно