싱글턴 패턴 - 객체가 생성되고 나면 어디서든지 다시 생성없이 사용 할 수 있도록 하는 패턴
1. static으로 자신 클래스 형의 전역변수를 만들고 getInstance() 메서드로 객체를 얻어서 사용한다
2. 멀티쓰레드 일 경우 동시에 접근해서 여러번 생성되지 않도록 동기화 시킨다
첫번째 방법 |
package singleton1; public class Singleton { |
특징 : getInstance() 의 동기화 synchronized 를 통해 한번에 한 사용자만 접근해서 객체를 생성 및 반환받는다 public class Singleton {
장점 : 객체를 처음부터 생성하지 않고 필요한 순간 생성 할 수 있다.
단점 : 매번 호출할때마다 null 비교 후 객체를 얻게 되고 동시에 많은 접근이 있을 경우 메서드의 동기화로 대기시간이 길어진다.
두번째 방법
package singleton2;
private static Singleton uniqueInstance = new Singleton();
public Singleton() {
}
public static Singleton getInstance() {
return uniqueInstance;
}
}
특징 : 시작부터 객체를 생성해버린다. public class Singleton {
장점 : 매번 생성되어 있는지 확인을 할 필요가 없다. 동기화로 인한 속도 저하도 없다
단점 : 객체가 무겁다면 처음부터 생성되어 있으므로 부담을 줄수도 있다
세번째 방법
package singleton3;
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 키워드를 사용하더라도 동기화가 잘 안되는 것이 많다 고 한다