language/scala2014.10.21 17:25

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

'language > scala' 카테고리의 다른 글

FP 비엄격성  (1) 2015.05.18
scala package object  (0) 2014.11.05
scala의 lazy 비용  (0) 2014.10.21
spray는 멋지군..  (0) 2014.10.20
Enum Type을 Slick 에서 사용하기  (0) 2014.10.07
Slick  (0) 2014.10.05
Posted by dev.bistro
TAG ,