gyoogle.dev 블로그와 jeong-pro 블로그를 참고하여 작성하였습니다.
이미지를 누르면 이미지의 출처로 이동합니다.
싱글톤패턴
- 어플리케이션이 시작될 때 클래스가 최초 한번만 메모리 할당하고 해당 메모리에 인스턴스 만들어 사용하는 패턴 -> static!
- java 에서는 생성자를 private로 선언해 다른 곳에서 생성 막고, getInstace()메소드 이용해 사용하게 구성
- 단 하나의 인스턴스 생성해서 사용하는 디자인 패턴
사용이유
- 고정된 메모리 영역 얻으면서 한번의 new 인스턴스를 사용하기 때문에 메모리 낭비를 방지
- 전역 인스턴스이기 때문에 데이터 공유가 쉬움
- 공통객체 여러개 생성해서 사용해야 하는 상황에 좋음
- DB에서 커넥션풀, 스레드 풀, 캐시, 로그기록 객체 등
- 안드로이드 앱에서 액티비티 들이나 클래스마다 클래스 하나씩 전달번거로워 접근쉽게
- 인스턴스가 절대적으로 한개만 존재하는것을 보증하고 싶을때 사용
문제점
- 많은 데이터를 싱글톤을 통해 공유할 경우 다른 클래스 간 인스턴스에 결합도 높아져 개방-폐쇄원칙 위배(객체지향 설계원칙 위배)
- 수정, 테스트 어려워짐
- 멀티스레드 환경에서 동기화 처리 안하면 인스턴스 중복생성 가능성 발생
- 꼭 필요한 상황 제외하면 지양
멀티스레드 환경에서 안전한 싱글톤 만드는 법
- Lazy Initialization
- Lazy Initialization+Double-checked Locking
- Initialization on demand holder idiom(holder에 의한 초기화)
-> 비용문제와 정확성때문에 Holder을 이용하는 법을 가장많이 사용(JVM 클래스 초기화 과정에서 보장되는 원자적 특성이용)
코드 참고