Double-Checked Locking

Double-Checked Locking은 C++/Java 세계에서는 Singleton 또는 Lazy Initialization을 구현하는데에 잘 알려진 idiom이다. DCL은 Singleton object를 생성하는 부분에 필요한 synchronization cost를 절약하기 위한 방법이다. (자세한 내용은 다음 paper를 참고. “Double-Checked Locking” http://www.cs.wustl.edu/~schmidt/PDF/DC-Locking.pdf)

하지만, DCL은 compiler optimization 문제와 Multiprocessor에서의 cache coherence 문제 때문에 portable하게(Memory barrier를 사용하지 않고) 동작하는 것이 불가능한 것이라고 한다. (자세한 내용은 Scott Meyer가 정리한 다음 note를 참고. “Double-Checked Locking, Threads, Compiler Optimizations, and More” http://www.nwcpp.org/Downloads/2004/DCLP_notes.pdf)

이러한 문제는 C++이 memory model(e.g. memory read/write ordering)을 명시하기 않기 때문이라고 볼 수도 있고, Java에서는 Memory Model의 개선을 통해 이 문제를 해결하려는 것 같다. (http://www.cs.umd.edu/~pugh/java/memoryModel/)

관련 링크들

“Double-Checked Locking”에 대한 1개의 생각

댓글 달기

이메일 주소는 공개되지 않습니다. 필수 필드는 *로 표시됩니다

이 사이트는 스팸을 줄이는 아키스밋을 사용합니다. 댓글이 어떻게 처리되는지 알아보십시오.