🔍 Singleton pattern
1. Eager initialization (이른 초기화)
- 미리 초기화를 시켜주고 해당 인스턴스를 return 해줌으로써 매번 같은 인스턴스를 가지게 됩니다.
- 문제점
- 메모리 낭비 : 사용하지 않을때도 항상 생성
- 예외 처리 불가능
2. Static block initialization
- 인스턴스가 static block 내에서 생성되어 예외 처리가 가능
- 단점
3. Lazy initialization
- getInstance가 호출될때 초기화를 해서 메모리 낭비의 단점을 해결함
- 문제점
- 동기화 보장 x
- 동기화 : 스레드가 수행되는 시점을 조절하여 서로가 알고 있는 정보가 일치하는 것인데, 쉽게 말해 스레드 간 데이터가 일치하도록 하는 것이다.
4. Thread safe initialization
- synchronized 를 통해서 동시에 여러 스레드가 접근하지 못하도록 막음
- 문제점
- 성능 저하 : 매번 synchronized가 실행됨
5. Double-Checked Locking
- instance null 체크를 synchronized 블록 밖과 안에서 총 2번 해줍니다. ⇒ 성능 저하가 줄어듬
- volatile : 변수를 메인 메모리에 저장, 주로 여러 스레드가 동시에 접근할 수 있는 변수에 사용
- volatile을 사용하지 않았을때 일어날 수 있는 문제점
6. Bill Pugh Solution
- final 을 통해 INSTANCE 첫 호출 후 재할당이 되지 않고, 동기화 보장이 가능합니다.
- final
- static은 클래스 로딩시점에 한번만 호출이 됨
- 초기화 후 변경이 불가능하다.
- final이 초기화되는 시점은 클래스의 부모 생성자가 실행 된 이후, 생성자 메소드가 실행되기 전
- final methods는 메소드 오버라이드 제한 , final class는 상속될 수 없음
- 클래스 로더 내용 추가하기
- https://velog.io/@skyepodium/클래스는-언제-로딩되고-초기화되는가
7. Enum
💁♀️ 직렬화/역직렬화
- 직렬화 : 자바 시스템 내부에서 사용되는 객체 또는 데이터를 외부의 자바 시스템에서도 사용할 수 있도록 바이트(byte) 형태로 데이터 변환하는 기술
- 외부의 자바 시스템 : 파일, db, 캐시와 같은 메모리, 다른 vm
- Serializable
- 마커인터페이스 : 아무 메서드도 담고 있지 않고, 단지 자신을 구현하는 클래스가 특정 속성을 가짐을 표시해주는 것
ObjectOutputStream
을 통해 쓸 수 있다고, 즉 직렬화 가능한 클래스 임을 알려준다.
- enum 이외에 다른 방식은 직렬화를 할때 문제가 생김
- 역직렬화 : 바이트로 변환된 데이터를 다시 객체로 변환하는 기술
💁♀️ Reflection
Reference
- 싱글톤
- 동기화 부분, volatile
- 직렬화/역직렬화
- 마커인터페이스
- 리플랙션
- 리플랙션으로 싱글톤 파괴하기