런타임노트

[헤드퍼스트 디자인패턴] 15일차. 205-216pg 본문

책책책 책을 읽읍시다‼ ver.개발/[ 헤드퍼스트 디자인패턴 ]

[헤드퍼스트 디자인패턴] 15일차. 205-216pg

D269 2023. 5. 10. 23:05
728x90

15일차

헤드퍼스트 디자인패턴 [3주차_수요일]

205-216pg

요약

CHAPTER 05. 하나뿐인 특별한 객체 만들기 (feat. 싱글턴 패턴)

  • 게으른 인스턴스 생성 (lazyinstantiation) : 인스턴스가 필요한 상황이 오기 전까지 아예 인스턴스를 생성하지 않도록 하는 방법.
  • 싱글톤 패턴의 생성자는 private으로 저장되어 있다. public으로 지정된 생성자는 없음
  • 싱클톤 객체가 필요할 때는 인스턴스를 달라고 요청한다. → getInstance()

 

[ 초콜릿 보일러 ]

  • 보일러가 가득 차 있을 때와 비어있을 때를 분리해서 코딩

[ 싱글톤 패턴 (Singleton Pattern) ]

클래스 인스턴스를 하나만 만들고, 그 인스턴스로의 전역 접근을 제공한다.

  • 이 패턴을 실제 적용할 때는 클래스에서 하나뿐인 인스턴스를 관리하도록 만든다.
  • 다른 어떤 클래스에서도 자신의 인스턴스를 추가로 만들지 못하게 한다,

→ 인스턴스가 필요하다면 반드시 클래스 자신을 거치도록

  • 어디서든 인스턴스에 접근 가능하도록 전역접근 지점을 제공한다.
  • 자원을 많이 잡아먹는 인스턴스일 경우, 게으른 인스턴스 생성 방식이 유용하다.

 

[ 멀티 스레딩 문제 ]

초콜릿 보일러에서 문제가 발생했다.

getInstance()를 동기화하면 멀티스레딩과 관련된 문제가 간단하게 해결된다,

→ 한 스레드가 메소드 사용을 끝내기 전까지 다른 스레드는 기다려야 한다.

하지만 동기화는 불필요한 오버헤드만 증가시킨다.

→ uniqueInstance 변수에 Singleton 인스턴스를 대입하면 동기화 상태로 유지하지 않아도 됨.

 

[ 멀티 스레딩에서도 싱글톤이 돌아가도록 ]

방법1. 정적초기화 부분에서 싱글톤의 인스턴스를 생성한다.

방법2. DCL(Double-Checked Locking)을 써서 getInstance()에서 동기화되는 부분을 줄인다. : 인스턴스가 생성되어 있는지 확인하고, 생성이 되어있지 않았을 때만 동기화 한다.

 

발췌

💡 volatile : 멀티스레딩을 쓰더라도 uniqueInstance 변수가 Singleton 인스턴스로 초기화되는 과정이 올바르게 진행된다.

 

 

 

728x90
반응형