Я рассматриваю возможность использования Scala в довольно интенсивной вычислительной программе. Профилирование версии нашего кода на С++ показывает, что мы могли бы извлечь большую пользу из оценки Lazy. Я пробовал это в 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