요르딩딩
[작성중 ]싱글톤 패턴 본문
728x90
반응형
싱글턴 패턴
인스턴스가 오직 1개만 생성되는 경우에 사용하는 패턴입니다.
하나의 인스턴스를 메모리에 등록해 여러 스레드가 동시에 해당 인스턴스를 공유하여 사용하게끔 할 수 있으므로,
요청이 많은 곳에서 사용하면 효율적입니다.
[주의할점]
여러 스레드가 공유하므로, 동시성 문제를 고려해야합니다.
[자바의 싱글턴 패턴 특징]
private constructor를 가지고, static method를 사용합니다.
[Eager Initialization (이른 초기화, Thread-safe)]
특징
- static키워드의 특징을 이용해서 클래스 로더가 초기화하는 시점에 정적바인딩(static binding)을 통해 해당 인스턴스를 메모리에 등록해 사용합니다.
- 클래스 로더에 의해 클래스가 최초로 로딩 될 때 객체가 생성되기 때문에 Thread-safe 합니다.
단점
- 객체를 사용하지 않는경우에도 new연산자를 통해 생성되는 불필요과정을 거칩니다.
[Lazy Initialization with synchronized (동기화 블록, Thread-safe)]
특징
- 메서드에 동기화 블럭을 지정해 Thread-safe를 보장합니다.
- 컴파일 시점에 인스턴스를 생성하는 것이 아니라, 인스턴스가 필요한 시점에 요청하여 동적 바인딩(dynamic binding)을 통해 인스턴스를 생성하는 방식입니다.
단점
- 인스턴스가 생성되었든, 안되었든 무조건 동기화 블록을 거치게되어있습니다.
- synchronized 키워드를 사용하면 성능이 약 100배 가량 떨어집니다.
[Lasy Initialization. Double Checking Locking(DCL, Thread-safe)]
특징
- 동기화블록을 개선한 방식입니다.
- 인스턴스가 생성되지 않은 경우에만 동기화블록이 실행되게 구현한 방식입니다.
- volatile 키워드를 사용하면 멀티스레딩을 사용하더라고 uniqueInstance변수가 Singleton 인스턴스로 초기화되는 과정이 올바르게 진행되도록할 수 있습니다.
[Lazy Initialization, Enum(열거 상수 클래스, Thread-safe)]
특징
- Enum 인스턴스의 생성은 기본적으로 Thread-safe합니다.
- 스레드관련 코드가 없어져 간단합니다.
- 아주 복잡한 직렬화 상황이나, 리플렉션 공격에도 제2의 인스턴스가 생성되는 것을 막아줍니다.
단점
- Enum내 다른 메서드가 있는 경우에 해당 메서드가 Thread-safe한지는 개발자가 책임져야합니다.
- 만들려는 싱글턴이 Enum 외의 클래스를 상속해야하는 경우에는 사용할 수 없습니다.
[Lazy Initialization. LazyHolder(게으른 홀더, Thread-safe)]
특징
- 가장 많이 사용되는 싱글턴 구현 방식입니다.
- volatile/Synchronized 키워드 없이도 동시성 문제를 해결하기 때문에 성능이 뛰어납니다.
- 싱글턴 클래스에는 내부클래스의 변수가 없기 때문에, static 멤버 클래스더라고, 클래스 로더가 초기화 과정을 진행할때, 내부클래스 메서드를 초기화하지 않고, 해당클래스를 호출하는 메서드가 실행될때 초기화됩니다.
- 동적바인딩의 특징을 이용하여 Thread-safe하면서 성능이 뛰어납니다.
- 내부클래스의 내부인스턴스는 static이기 때문에 클래스 로딩시정에 한번만 호출된다는 점을 이용
- final를 써서 다시 값이 할당되지 않습니다.
728x90
반응형
'[Java]' 카테고리의 다른 글
String(문자열)을 Object(객체)로 변환하는 법 (0) | 2021.12.02 |
---|---|
param( "A,B,C" ) -> array ( [A,B,C] )으로 변경 (0) | 2021.11.23 |
[JAVA] StringBuffer (0) | 2021.05.26 |
[JAVA] (collection) iterator (0) | 2021.05.24 |
[JAVA] String.getBytes("")'; (0) | 2021.05.20 |
Comments