반응형
싱글톤(Singleton)패턴 : 인스턴스를 오직 한개만 제공하는 클래스
싱글콘 패턴 구현방법 1
private static Singleton1 instance;
private Singleton1() {}
public static Singleton1 getInstance(){
if(instance == null){
instance = new Singleton1();
}
return instance;
}
- 해당 방법은 가장 기본적이나 동기화 되지 않아 멀티스레스 환경에서 여러개의 쓰레드가 동시에 if(instance == null)에 접근하여 서로 다른 인스턴스를 가질 가능성이 있다.
싱글콘 패턴 구현방법 2
private static Singleton2 instance;
private Singleton2(){}
public static synchronized Singleton2 getInstance(){
if(instance == null){
instance = new Singleton2();
}
return instance;
}
- synchronized는 클랙스락으로 객첵에 락을 걸어 버려 해당 함수에 대한 접근이 빈번한 경우 리소스 소모가 크다.
싱글콘 패턴 구현방법 3 (eager initialization, 이른 초기화)
private static final Singleton4 INSTANCE = new Singleton4();
private Singleton4(){}
public static Singleton4 getInstance(){
return INSTANCE;
}
- 미리 메모리에 로딩하여 사용하기 때문에 메모리를 많이 사용하는데 사용하지 않는 경우 메모리 낭비가 발생하게 된다. 즉, 클라이언트가 사용하지 않더라고 항상 메모리는 사용하게 된다는 단점이 있다. exception에 대한 처리가 없다. 해당 처리를 위해서는 static block을 이용하여 예외처리를 해줘야한다.
싱글콘 패턴 구현방법 4 (double checked locking)
private static volatile Singleton3 instance;
private Singleton3(){}
public static Singleton3 getInstance(){
if(instance == null){
synchronized (Singleton3.class){
if(instance == null){
instance = new Singleton3();
}
}
}
return instance;
}
- 조건문 2개를 이용하여 check가 이뤄진다. volatile 를 사용하여 멀티스레드환경에서도 인스터스 불일치를 해결할 수 있다.
- volatile
- 멀티스레드 환경에서 하나의 스레드는 Read/Write를 다른 스레드는 Only Read
- CPU의 캐시를 거치지 않고 메인 메모리에 직접 Read/Write 수행
- volatile을 사용하지 않는 멀티 스레드 환경에서는 CPU 캐시에 값을 저장하게 되는데 각각의 스레드가 갖는 변수의 값이 불일치
- volatile 변수에 대한 접근은 synchronized를 사용하는 것과 동일하게 동작
싱글콘 패턴 구현방법 5 (static inner 클래스 홀더 )
private Singleton5(){}
private static class SingleHolder{
private static final Singleton5 SINGLETON_5 = new Singleton5();
}
public static Singleton5 getInstance(){
return SingleHolder.SINGLETON_5;
}
-권장 방법 및 가장 널리 사용되는 방법, Inner Class로 선언되었기 때문에 싱글톤 클래스의 getInsance()가 호출 될 때 JVM메모리에 로드되고 객체를 생성한다.
싱글콘 패턴 구현방법 6 (enum 사용 )
public enum Singleton6 {
INSTANCE;
}
- 클래스가 로딩하는 순간 미리 만들어진다는 단점과 상속을 받아 사용하지 못한다. 상속을 받아 사용할 경우 클래스홀더를 이용하면 된다.
반응형
댓글