기록하는 개발자

6. Singleton Pattern 본문

3-2/고급객체지향프로그래밍(디자인패턴)

6. Singleton Pattern

밍맹030 2021. 1. 14. 16:47
728x90

문제

여러 객체가 생성되면 상태 관리가 어려움

 

해결 방안

객체 생성자를 중앙 관리

 

목적

클래스가 1개의 instance만을 만들 수 있도록 하고, 어디서나 생성된 instance에 접근할 수 있도록 함

 

결과

객체가 1개라서 일관된 상태

 

고전적인 singleton pattern 구현 방법

private default 생성자 구현

singleton instance를 저장하는 정적 멤버 변수 생성

singleton instance를 반환하는 정적 factory method 구현

(multi-thread를 사용하는 프로그램에서는 문제가 될 수 있음)

 

Thread-safe 버전의 singleton

여러 개의 스레드에서 위 코드가 사용되면 문제가 발생할 수 있다.

해결 방법 : getinstance() 함수에 동기화 시키는 코드 삽입

 

문제

비효율적일 수 있다(느려질 수 있다)

 

해결 방법

getInstance()의 속도가 크게 영향 미칠 정도가 아니라면 그냥 둔다.

instance를 필요할 때 생성하지 않고, 프로그램이 시작될 때 생성

(생성자 실행 시 시간이 오래 걸리면 문제가 생기는 것)

 

DCL(Double-checking Locking)을 사용해 getInstance() 함수에서 동기화 되는 부분 줄이기

-instance가 생성되어 있는 지 확인 후, 생성되어 있지 않았을 때만(null일 때) 동기화를 시킬 수 있음

volatile을 사용하는 경우 C1객체를 만들고 바로 cache가 아닌 main memory에 저장한다.

volatile

변수를 CPU cache에 저장하지 않고 메모리에서 읽고 저장

thread를 사용할 때 다른 프로세서에 있는 cache에 변수값이 저장되어 서로 다른값을 사용하는 것을 방지

 

synchronized

여러 thread에서 사용하려고 할 때 locking 메커니즘( ex)mutual lock )을 제공해서

 한 번에 한 개 thread만 사용할 수 있도록 함

 

또 다른 방법 : 내부 정적 클래스 사용

- 내부 정적 클래스를 사용하면 JVM에서는 해당 singleton calss를 메모리에 load(적재)할 때,

  정적 멤버 변수가 없으므로 singleton instance를 생성하지 않는다.

- getInstance를 호출하면 내부에 있는 정적 class의 instance를 생성해서 반환

 

728x90

'3-2 > 고급객체지향프로그래밍(디자인패턴)' 카테고리의 다른 글

8. Adapter Pattern  (0) 2021.01.15
7. Command Pattern  (0) 2021.01.15
5. Factory Pattern  (0) 2021.01.14
4. Decorator Pattern+예제  (0) 2021.01.14
3. Observer Pattern  (0) 2021.01.14