본문 바로가기

Java/DesignPattern

[HeadFirst] 5장 싱글턴 패턴

용도

  • 인스턴스를 한개 만 쓰기 위해서
  • 특정 클래스에 객체 인스턴스가 하나만 만들어지도록 해줄때
  • 전역 변수 대신 사용하기 위해, 전역 변수는 애플리케이션이 시작될 때 객체가 생성되는데, 자원을 많이 차지하게 됨
  • 연결 풀이나 스레드 풀과 같은 자원풀을 사용할 때

싱글턴 패턴

  • 클래스 인스턴스를 하나만 만들고, 그 인스턴스로의 전역 접근을 제공합니다.
  • 다른 어떤 클래스에서도 자신의 인스턴스를 추가로 만들지 못하게 해야한다. 필요하다면 클래스 자신을 거치도록 하게 합니다.
  • 어디서든 그 인스턴스에 접근할 수 있도록 전역 접근 지점을 제공합니다.
  • 리플렉션, 직렬화, 역질렬화에서 문제가 발생할 수 있다. (enum으로 싱글턴을 생성하면 해결가능)

멀티스레딩 문제 해결하기

  • 인스턴스를 가져오는 함수에 synchronized 를 적용한다.
  • 인스턴스가 필요할 때는 생성하지 말고 처음부터 만든다.
public class Singleton{
	private static Singleton uniqueInstance = new Singleton();
    
    private Singleton() {}
    
    pubic static Singleton getInstance(){
    	return uniqueInstance;
    }
    
}
  • DCL을 써서 getIntance()에서 동기화되는 부분을 줄인다.
public class Singleton{
	private volatile static Singleton uniqueInstance = new Singleton();
    
    private Singleton() {}
    
    pubic static Singleton getInstance(){
    	if( uniqueInstance = null ){
        	synchronized ( Singleton.class ){
            	if( uniqueInstance == null ){
                	uniqueInstance = new Singleton();
                    }
                }
        }
    	return uniqueInstance;
    }
    
}

싱글턴 enum 사용하기

public enum Singleton {
	UNIQUE_INSTANCE;
 	...   
}

public class SingletonClient{
	public static void main(String[] args){
    	Singleton singleton = Singleton.UNIQUE_INSTANCE;
        // 여기서 싱클턴 사용
    }
}

'Java > DesignPattern' 카테고리의 다른 글

[HeadFirst] 4장 팩토리 패턴  (0) 2022.08.16
[HeadFirst] 3장 데코레이션 패턴  (0) 2022.08.13
[헤드퍼스트] 2장 옵저버 패턴  (0) 2022.08.07
[헤드퍼스트] 1장 전략패턴  (0) 2022.08.02