일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
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 |
- 디자인 패턴
- 자바 공부
- react firebase
- React JS
- 컴퓨터 네트워크
- 프로그래머스
- 백준
- 프로그래머스 자바
- design pattern
- 프로그래머스 완전탐색
- 코틀린
- useState
- websocket
- 장고
- useEffect
- codesandbox
- NextJS
- 자바
- vanillaJS
- 코딩테스트 고득점 Kit
- 자바스크립트
- 리액트
- react hook
- react
- 리액트 훅
- 프로그래밍 언어론
- 코딩테스트 고득점 Kit 완전탐색
- Java
- 데이터모델링과마이닝
- JavaScript
- Today
- Total
기록하는 개발자
6. Singleton Pattern 본문
문제
여러 객체가 생성되면 상태 관리가 어려움
해결 방안
객체 생성자를 중앙 관리
목적
클래스가 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
변수를 CPU cache에 저장하지 않고 메모리에서 읽고 저장
thread를 사용할 때 다른 프로세서에 있는 cache에 변수값이 저장되어 서로 다른값을 사용하는 것을 방지
synchronized
여러 thread에서 사용하려고 할 때 locking 메커니즘( ex)mutual lock )을 제공해서
한 번에 한 개 thread만 사용할 수 있도록 함
또 다른 방법 : 내부 정적 클래스 사용
- 내부 정적 클래스를 사용하면 JVM에서는 해당 singleton calss를 메모리에 load(적재)할 때,
정적 멤버 변수가 없으므로 singleton instance를 생성하지 않는다.
- getInstance를 호출하면 내부에 있는 정적 class의 instance를 생성해서 반환
'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 |