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 Is Broken http://c2.com/cgi/wiki?DoubleCheckedLockingIsBroken
- The “Double-Checked Locking is Broken” Declaration http://www.cs.umd.edu/~pugh/java/memoryModel/DoubleCheckedLocking.html
- Double-checked locking and the Singleton pattern http://www-106.ibm.com/developerworks/java/library/j-dcl.html
- Double-checked locking: Clever, but broken http://www.javaworld.com/javaworld/jw-02-2001/jw-0209-double_p.html
- Warning! Threading in a multiprocessor world http://www.javaworld.com/javaworld/jw-02-2001/jw-0209-toolbox.html
- Synchronization and the Java Memory Model http://gee.cs.oswego.edu/dl/cpj/jmm.html
오옷, 그런 것이었군.