본문 바로가기

Programming/Java

Safe double checked locking

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