Это ошибка в ленивой реализации Scala 2.9.1 или просто артефакт декомпиляции

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

11
задан fbl 22 October 2011 в 20:28
поделиться