scala의 lazy 비용
lazy val x = 솰라솰라...
단순히 늦은/지연 연산일 줄만 알았다...
test
class lazyval {
lazy val x = 5
}
를 scalac로 컴파일하고 다시 디컴파일 해서 내용을 보면
public class lazyval
{
private int x$lzycompute()
{
synchronized(this)
{
if(!bitmap$0)
{
x = 5;
bitmap$0 = true;
}
BoxedUnit _tmp = BoxedUnit.UNIT;
}
return x;
}
public int x()
{
return bitmap$0 ? x : x$lzycompute();
}
public lazyval()
{
}
private int x;
private volatile boolean bitmap$0;
}
- voliatile boolean의 flag가 하나 생성된다
- 초기화 되지 않았다면 synchronized 으로 묶어 초기화를 한다 (오쉿1)
- 이후 voliatile bitmap$0을 계속 참고한다.(오쉿2)
읽기 비용이 있다는걸 잊지 말자.
자세한 내용은 SIP-20 http://docs.scala-lang.org/sips/pending/improved-lazy-val-initialization.html#version_v4__the_cas_improvement