Я рассматриваю возможность использования Scala в довольно сложной вычислительной программе. Профилирование версии нашего кода на C ++ показывает, что мы можем значительно выиграть от ленивой оценки. Я попробовал это в Scala 2.9.1 и мне очень понравилось. Однако, когда я запускал класс через декомпилятор, реализация выглядела не совсем правильно. Я предполагаю, что это артефакт декомпилятора, но я хотел получить более убедительный ответ ...
рассмотрим следующий тривиальный пример:
class TrivialAngle(radians : Double)
{
lazy val sin = math.sin(radians)
}
когда я декомпилирую это, я получаю это:
import scala.ScalaObject;
import scala.math.package.;
import scala.reflect.ScalaSignature;
@ScalaSignature(bytes="omitted")
public class TrivialAngle
implements ScalaObject
{
private final double radians;
private double sin;
public volatile int bitmap$0;
public double sin()
{
if ((this.bitmap$0 & 0x1) == 0);
synchronized (this)
{
if (
(this.bitmap$0 & 0x1) == 0)
{
this.sin = package..MODULE$.sin(this.radians);
this.bitmap$0 |= 1;
}
return this.sin;
}
}
public TrivialAngle(double radians)
{
}
}
Для меня блок возврата находится не в том месте, и вы всегда получите блокировку. Это не может быть тем, что делает настоящий код, но я не могу это подтвердить. Кто-нибудь может подтвердить или опровергнуть, что у меня есть фиктивная декомпиляция, и что ленивая реализация является несколько разумной (то есть блокирует только когда вычисляет значение и не получает блокировку для последующих вызовов?)
Спасибо!
Для справки, это декомпилятор, который я использовал:
http://java.decompiler.free.fr/?q=jdgui