Java 프로그래밍으로 multi-threaded 애플리케이션을 만들 때, double checked locking idiom 을 이용하여 코드를 작성할 때, 아래와 같은 코드는 정확히 작동하지 않는다.
// Single threaded version class Foo { private Helper helper = null; public Helper getHelper() { if (helper == null) helper = new Helper(); return helper; } // other functions and members... }Multi-threaded 애플리케이션에서 안전하게 코드를 작성하는 방법
1. Java 1.5 이상에서는 아래와 같이 코드를 작성하면 위의 코드가 정확히 작동한다.
// Works with acquire/release semantics for volatile
// Broken under current semantics for volatile
class Foo {
private volatile Helper helper = null;
public Helper getHelper() {
if (helper == null) {
synchronized(this) {
if (helper == null)
helper = new Helper();
}
}
return helper;
}
}
2. 또 다른 방법으로 Helper 클래스의 모든 필드를 immutable 하게 작성해도 된다. immutable 하게 작성하는 방법은 각각의 field 에 final 키워드를 붙여서 할 수 있다.
출처: http://www.cs.umd.edu/~pugh/java/memoryModel/DoubleCheckedLocking.html
'Programming > Java' 카테고리의 다른 글
Marshalling vs Serialization (마샬링 과 시리얼라이즈 의 차이) (1) | 2013.02.06 |
---|---|
import 문 기술 순서 규칙 (0) | 2013.01.09 |
Java byte code 에 관하여 (0) | 2012.11.27 |
Apache Ant 로 Runnable JAR 파일 만들기 (0) | 2012.11.27 |
Java PECS (producer-extends, consumer-super) 에 관하여 (0) | 2012.11.27 |