블로그 이미지
헤이장

Notice

Recent Post

Recent Comment

Recent Trackback

calendar

1 2 3 4 5
6 7 8 9 10 11 12
13 14 15 16 17 18 19
20 21 22 23 24 25 26
27 28 29 30 31
  • total
  • today
  • yesterday
2009. 7. 27. 13:35 Web/DesignPattern

싱글턴 패턴 - 객체가 생성되고 나면 어디서든지 다시 생성없이 사용 할 수 있도록 하는 패턴

1. static으로 자신 클래스 형의 전역변수를 만들고
getInstance() 메서드로 객체를 얻어서 사용한다
2. 멀티쓰레드 일 경우 동시에 접근해서 여러번 생성되지 않도록 동기화 시킨다

 첫번째 방법

package singleton1;
 

public class Singleton {
    private static Singleton uniqueInstance;
    public Singleton() {
    }
    public static synchronized Singleton getInstance() {
        if (uniqueInstance == null) {
            uniqueInstance = new Singleton();
        }
        return uniqueInstance;
    }
}


특징 : getInstance() 의 동기화 synchronized 를 통해 한번에 한 사용자만 접근해서 객체를 생성 및 반환받는다
장점 : 객체를 처음부터 생성하지 않고 필요한 순간 생성 할 수 있다.
단점 : 매번 호출할때마다 null 비교 후 객체를 얻게 되고 동시에 많은 접근이 있을 경우 메서드의 동기화로 대기시간이 길어진다.

 두번째 방법


package singleton2;
 

public class Singleton {
    private static Singleton uniqueInstance = new Singleton();
    public Singleton() {
    }
    public static Singleton getInstance() {
        return uniqueInstance;
    }
}


특징 : 시작부터 객체를 생성해버린다.
장점 : 매번 생성되어 있는지 확인을 할 필요가 없다. 동기화로 인한 속도 저하도 없다
단점 : 객체가 무겁다면 처음부터 생성되어 있으므로 부담을 줄수도 있다

 세번째 방법


package singleton3;

public class Singleton {
    private volatile static Singleton uniqueInstance;
    public Singleton() {
    }
    public static Singleton getInstance() {
        if (uniqueInstance == null) {
            synchronized (Singleton.class) {
                if (uniqueInstance == null) {
                    uniqueInstance = new Singleton();
                }
            }
        }
        return uniqueInstance;
    }
}


특징 : DCL (double checking locking) 을 써서 동기화를 줄여준다. volatile 사용
       * volatile 키워드를 사용하면 멀티스레딩을 쓰더라도 uniqueInstance 변수가
          Singleton 인스턴스로 초기화 되는 과정이 올바르게 진행되도록 할 수 있습니다
장점 : 생성 부분만 동기화를 시켜서 대기시간을 줄여준다
단점 : 자바 1.4 및 이전 버젼에서는 volatile 키워드를 사용하더라도 동기화가 잘 안되는 것이 많다 고 한다

posted by 헤이장