Ответ 1
Сделано поточно-безопасным с помощью двойной проверки http://code-o-matic.blogspot.com/2009/05/double-checked-locking-idiom-sweet-in.html Очевидно, что это означает, что доступ к ленивым валам медленнее, чем не-ленивый из них.
Возможный дубликат:
Какова (скрытая) стоимость ленивого val? (Scala)
Scala позволяет определять ленивые значения
lazy val maybeUnusedValue = someCostlyInitialization
где someCostlyInitialization
оценивается только при первом использовании maybeUnusedValue
. То есть, он оценивается не более одного раза, и если maybeUnusedValue
никогда не используется, он также никогда не оценивается вообще.
Является ли это потокобезопасным? Каковы последствия этого? Если это должно быть потокобезопасным, он должен каким-то образом использовать какую-то синхронизацию/использование Java volatile. К сожалению, Scala спецификация языка ничего не говорит об этом.
Сделано поточно-безопасным с помощью двойной проверки http://code-o-matic.blogspot.com/2009/05/double-checked-locking-idiom-sweet-in.html Очевидно, что это означает, что доступ к ленивым валам медленнее, чем не-ленивый из них.
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;
}
}
}
Как вы видите, это использование парадигмы двойной проверки с изменчивой переменной. Поэтому я думаю, что это безопасно