Notice
Recent Posts
Recent Comments
Link
일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | ||||||
2 | 3 | 4 | 5 | 6 | 7 | 8 |
9 | 10 | 11 | 12 | 13 | 14 | 15 |
16 | 17 | 18 | 19 | 20 | 21 | 22 |
23 | 24 | 25 | 26 | 27 | 28 | 29 |
30 | 31 |
Tags
- Java
- MSA
- 알고리즘
- Parallel Old GC
- 스레드
- Spring Boot Actuator
- thread
- zipkin
- 생산자 소비자 패턴
- 사가 패턴
- Action Pattern
- Resilinece4j
- spring cloud
- Serial GC
- 스프링 배치
- 멀티스레드
- 디자인 패턴
- 디자인패턴
- JPA
- java 정렬
- TypeScript
- 체인 패턴
- Spring Cloud Netfilx Eureka
- spring batch
- 타입스크립트
- 배치
- Transaction Pattern
- saga pattern
- 키클락
- The law of Demeter
Archives
- Today
- Total
PSD( Private-Self-Development )
싱글톤 패턴(Singleton pattern) 본문
싱글톤 패턴?
객체 인스턴스를 1개만 유지 및 사용하기 위한 디자인 패턴
싱글톤 패턴의 장점
- 무분별한 인스턴스 생성을 방지하기 때문에, 메모리낭비를 줄일 수 있다.
- 동일 자원 공유 및 사용
- 인스턴스가 1개만 존재함을 보증
싱글톤 패턴의 단점
- 객체지향의 단일 책임 원칙을 위반하므로 남용해서는 안된다.
- 클래스 본연의 목적을 해결하기 위한 본연의 책임
- 중복 객체 생성 방지를 위한 책임
- 자식 클래스 생성 이 불가능하다.
- 유연성이 떯어진다.
싱글톤 패턴 구현
volatile를 이용한 개선된 DCL(Double-Checked-Locking) Singleton 패턴 (jdk 1.5 이상에서 사용)
- jdk 버전에 의존적
public class A {
private volatile static A instance;
private A(){
}
public static A getInstance() {
if (instance == null) {
synchronized (A.class) {
if (instance == null) {
instance = new A();
}
}
}
return instance;
}
}
LazyHolder Singleton 패턴
- getInstance() 메서드에서 LazyHolder.INSTANCE를 참조하는 순간 Class가 로딩되며 초기화가 진행된다. Class를 로딩하고 초기화하는 시점은 thread-safe를 보장하기 때문에 volatile이나 synchronized 같은 키워드가 없어도 thread-safe 하면서 성능도 보장하는 아주 훌륭한 방법이다.
public class A {
private A(){
}
public static A getInstance() {
return LazyHolder.INSTANCE;
}
private static class LazyHolder {
private static final A INSTANCE = new A();
}
}
정적 클래스 와의 차이점
- 메모리의 상주
- 싱글톤
- 메모리 자원에 할당하여 동적 객체를 생성한다.
- 정적 클래스
- 코드가 실행되며, 고정으로 바인딩된다.
- 싱글톤
- 동적/비동적 차이
- 싱글톤
- 인터페이스를 통한 구현 대체 가능 (객체지향 다형성)
- 정적 클래스
- 비동적
- 싱글톤
- 다른 클래스 와의 관계가 있거나 클래스 초기화 동작이 복잡한 경우, 정적 클래스만으로는 처리가 어렵다.
참조