요르딩딩

[작성중 ]싱글톤 패턴 본문

[Java]

[작성중 ]싱글톤 패턴

요르딩딩 2021. 8. 10. 15:37
728x90
반응형

https://webdevtechblog.com/%EC%8B%B1%EA%B8%80%ED%84%B4-%ED%8C%A8%ED%84%B4-singleton-pattern-db75ed29c36

 

싱글턴 패턴

 

인스턴스가 오직 1개만 생성되는 경우에 사용하는 패턴입니다.

 

하나의 인스턴스를 메모리에 등록해 여러 스레드가 동시에 해당 인스턴스를 공유하여 사용하게끔 할 수 있으므로,

요청이 많은 곳에서 사용하면 효율적입니다.

 

[주의할점] 

여러 스레드가 공유하므로, 동시성 문제를 고려해야합니다.

 

[자바의 싱글턴 패턴 특징]

private constructor를 가지고, static method를 사용합니다.

 

[Eager Initialization (이른 초기화, Thread-safe)]

특징

  1. static키워드의 특징을 이용해서 클래스 로더가 초기화하는 시점에 정적바인딩(static binding)을 통해 해당 인스턴스를 메모리에 등록해 사용합니다.
  2. 클래스 로더에 의해 클래스가 최초로 로딩 될 때 객체가 생성되기 때문에 Thread-safe 합니다.

 

단점

  1. 객체를 사용하지 않는경우에도 new연산자를 통해 생성되는 불필요과정을 거칩니다.

 

[Lazy Initialization with synchronized (동기화 블록, Thread-safe)]

특징

  1. 메서드에 동기화 블럭을 지정해 Thread-safe를 보장합니다.
  2. 컴파일 시점에 인스턴스를 생성하는 것이 아니라, 인스턴스가 필요한 시점에 요청하여 동적 바인딩(dynamic binding)을 통해 인스턴스를 생성하는 방식입니다.

 

단점

  1. 인스턴스가 생성되었든, 안되었든 무조건 동기화 블록을 거치게되어있습니다.
  2. synchronized 키워드를 사용하면 성능이 약 100배 가량 떨어집니다.

 

[Lasy Initialization. Double Checking Locking(DCL, Thread-safe)]

특징

  1. 동기화블록을 개선한 방식입니다.
  2. 인스턴스가 생성되지 않은 경우에만 동기화블록이 실행되게 구현한 방식입니다.
  3. volatile 키워드를 사용하면 멀티스레딩을 사용하더라고 uniqueInstance변수가 Singleton 인스턴스로 초기화되는 과정이 올바르게 진행되도록할 수 있습니다.

 

[Lazy Initialization, Enum(열거 상수 클래스, Thread-safe)]

특징

  1. Enum 인스턴스의 생성은 기본적으로 Thread-safe합니다.
  2. 스레드관련 코드가 없어져 간단합니다.
  3. 아주 복잡한 직렬화 상황이나, 리플렉션 공격에도 제2의 인스턴스가 생성되는 것을 막아줍니다.

 

단점

  1. Enum내 다른 메서드가 있는 경우에 해당 메서드가 Thread-safe한지는 개발자가 책임져야합니다.
  2. 만들려는 싱글턴이 Enum 외의 클래스를 상속해야하는 경우에는 사용할 수 없습니다.

 

[Lazy Initialization. LazyHolder(게으른 홀더, Thread-safe)]

특징

  1. 가장 많이 사용되는 싱글턴 구현 방식입니다.
  2. volatile/Synchronized 키워드 없이도 동시성 문제를 해결하기 때문에 성능이 뛰어납니다.
  3. 싱글턴 클래스에는 내부클래스의 변수가 없기 때문에, static 멤버 클래스더라고, 클래스 로더가 초기화 과정을 진행할때, 내부클래스 메서드를 초기화하지 않고,  해당클래스를 호출하는 메서드가 실행될때 초기화됩니다.
  4. 동적바인딩의 특징을 이용하여 Thread-safe하면서 성능이 뛰어납니다.
  5. 내부클래스의 내부인스턴스는 static이기 때문에 클래스 로딩시정에 한번만 호출된다는 점을 이용
  6. 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