용도
- 인스턴스를 한개 만 쓰기 위해서
- 특정 클래스에 객체 인스턴스가 하나만 만들어지도록 해줄때
- 전역 변수 대신 사용하기 위해, 전역 변수는 애플리케이션이 시작될 때 객체가 생성되는데, 자원을 많이 차지하게 됨
- 연결 풀이나 스레드 풀과 같은 자원풀을 사용할 때
싱글턴 패턴
- 클래스 인스턴스를 하나만 만들고, 그 인스턴스로의 전역 접근을 제공합니다.
- 다른 어떤 클래스에서도 자신의 인스턴스를 추가로 만들지 못하게 해야한다. 필요하다면 클래스 자신을 거치도록 하게 합니다.
- 어디서든 그 인스턴스에 접근할 수 있도록 전역 접근 지점을 제공합니다.
- 리플렉션, 직렬화, 역질렬화에서 문제가 발생할 수 있다. (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 |