반응형
개념
인스턴스를 오직 하나만 생성하여 사용하는 패턴
장점
- 오직 한개의 인스턴스만 메모리에 저장되므로 메모리 효율적임
- 멀티 스레드 환경에서 여러 요청에 대한 처리가 필요할때 효율적임
- 스프링 컨테이너에서 빈(객체)들을 싱글톤으로 관리함
단점
- 코드 자체가 늘어난다.
- 잘못된 방식의 구현은 멀티 스레드 환경에서 '동시성' 문제 즉 스레드 언세이프 이슈가 발생할 수 있다.
- private 생성자로 인한 상속 불가
- 테스트 어려움 (mock 객체 생성 불가 -> static 메서드나 생성자는 mockito로는 mocking이 불가능)
주의사항
- 딱 1개의 인스턴스만 존재해야하므로, 생성자를 private으로 하여 외부에서 new 키워드로 인스턴스 생성을 방지하도록 한다.
- 싱글톤 객체는 상태를 무상태(stateless)로 설계해야 한다.
- 특정 클라이언트에 의존적인 필드가 없어야 한다.
- 특정 클라이언트가 값을 변경할 수 있는 필드가 없어야 한다.
- 읽기만 가능해야 한다.
싱글톤 구현
1) pubilc 필드방식
public class Singleton {
public static final Singleton INSTANCE = new Singleton();
private Singleton() {}
/* method */
...
}
2) 정적 팩터리 방식
public class Singleton {
private static final Singleton INSTANCE = new Singleton();
private Singleton() {}
public static Singleton getInstance() {
return INSTANCE;
}
/* method */
...
}
3) 원소가 하나인 열거 타입 방식 (enum 자체가 스레드 세이프 보장)
public enum Singleton {
INSTANCE;
/* method */
...
}
4) 위험한 방식 (스레드 언세이프)
public class {
private static Singleton instance;
private Singleton() {}
public static Singleton getInstance() {
if(instance == null) { //멀티 스레드 환경에서 여러 스레드가 동시 접근 시 문제 발생
instance = new Singleton();
}
return instance;
}
}
반응형
'Java' 카테고리의 다른 글
[Java] 특정 달의 특정 날 요일 구하기 (ex 첫째날 요일 구하기) (0) | 2022.08.15 |
---|---|
[Java] String = "" / String = new String("") 비교 (0) | 2020.02.15 |
[Java] 상속 (1) | 2019.05.05 |
[Java] 추상화 (1) | 2019.05.02 |
[Java] JVM(Java Virtual Machine) (0) | 2019.04.28 |