본문 바로가기
프로그래밍 놀이터/안드로이드, Java

[Java] Double-checked locking 을 사용하지 말자!

by 돼지왕왕돼지 2014. 3. 31.
반응형


 [Java] Double-checked locking 을 사용하지 말자!

 

[Java] Double-checked locking 을 사용하지 말자!


Double checked locking 이란?


보통 synchronized block 은 performance 이슈를 부르기 쉽다.

double-checked lockingperformance 이슈를 조금 완화시켜준다.


double-checked locking 은 null check 와 같은 부분을 synchronized 밖으로 빼서

synchronized 를 기다리지 않고 처리하게 만들어 준다.


volatile 을 주면 read, write 가 sync 로 걸릴 경우 write 를 먼저 하게 하고, read 를 나중에 하게 한다.

volatile 이 없다면 반대로 read 를 보통 먼저 하고 write 를 나중에 한다고 한다.


double-check + volatile 이 double-checked locking.




Double checked locking 을 사용하지 말자!


이렇게 double checked locking 에 대해 알아봤는데, double checked locking 은 안전하지 못하다고 한다.

Multi-processor 가 shared-memory 를 사용하면서 문제가 발생하기 쉽다고 한다.


일부에서는 일반 object 를 lock 으로 잡지않고, synchronized 를 이용하면 가시성이 확보되어서 괜찮다는 의견도 있지만, 아직도 논란이 있다.


괜히 논란이 되어 이상하게 작동하는 프로그램을 만드느니,

우선은 performance 보다는 안정성을 선택하는 것이 좋아보인다.


이 부분에 대해서는 추후 공부를 해서 다시 포스팅하도록 하겠다.


<참고 자료>


http://c2.com/cgi/wiki?DoubleCheckedLockingIsBroken


http://blog.naver.com/PostView.nhn?blogId=jjoommnn&logNo=130036635345&parentCategoryNo=4&viewDate&currentPage=1&listtype=0






반응형

댓글1

  • 박정환 2021.06.04 18:50

    글을 정정하셔야 할꺼 같습니다. java concurrency 패키지의 Lock을 활용한 DCL은 말씀하신대로 안전하지 않은 문제가 발생할 수 있으나. synchronized를 활용한 DCL은 완벽하게 스레드 안전을 보장합니다.

    class Singleton {
    private volatile Singleton instance;
    public Singleton getInstance() {
    Singleton instanceRef = instance;
    if (instanceRef == null) {
    synchronized (this) {
    instanceRef = instance;
    if (instanceRef == null) {
    instance = instanceRef = new Singleton();
    }
    }
    }
    return instanceRef;
    }
    }
    답글