싱글톤에서 Early, Lazy 초기화의 차이
안녕하세요. 싱글톤에서 Early, Lazy 초기화의 차이를 공부하기 위해 클래스 로드에 개념을 처음으로 딥하게 공부해보고 있습니다.
클래스 로드와 사용에 따른 초기화간 heap 메모리 할당이 되는지도 공부하기 위해 위와 같이 트래킹해봤습니다.
저는 트래킹 결과를 보고 아래와 같이 해석했습니다.
1. 사용하지 않으면 early, lazy 모두 초기화되지 않는다.
2. early 는 getInstance() 메소드로 진입할 때 초기화 된다.
lazy 는 getInstance() 메소드가 끝날 때 Holder 를 통해 초기화 된다.
하지만 강의에는 early 초기화시 사용하지 않아도 생성된다고 말씀해주셨습니다.
그렇다면 캡쳐 1에서 인스턴스가 보여야된다고 생각했는데 보이지 않아 혼동이 와서 질문 드립니다.
혹시 제가 개념이 헷갈리거나 트래킹을 잘못하고 있는 것일까요..? ㅠㅠ
public class App {
public static void main(final String[] args) {
singleton();
}
private static void singleton() {
final EarlyInitializationSingleton early = EarlyInitializationSingleton.getInstance(); // 캡쳐 1
final LazyInitializationSingleton lazy = LazyInitializationSingleton.getInstance(); // 캡쳐 3
System.out.println("end"); // 캡쳐 5
}
}
public class EarlyInitializationSingleton {
private static final EarlyInitializationSingleton INSTANCE = new EarlyInitializationSingleton();
private EarlyInitializationSingleton() {
}
public static EarlyInitializationSingleton getInstance() {
return INSTANCE; // 캡쳐 2
}
}
public class LazyInitializationSingleton {
private LazyInitializationSingleton() {
}
private static class LazyInitializationSingletonHolder {
private static final LazyInitializationSingleton INSTANCE = new LazyInitializationSingleton();
}
public static LazyInitializationSingleton getInstance() {
return LazyInitializationSingletonHolder.INSTANCE; // 캡쳐 4
}
}
답변 1
4
작성하신 예제는 매우 적절한 예제로 보여집니다.
제가 수업에서 "사용하지 않아도 생성된다"는 말은 해당 클래스의 "getInstance()를 사용하지 않아도 생성된다"는 말입니다.
클래스로딩이 발생할 때 생기면 eager 로딩, 실제로 필요로 할 때 만들어진다면 lazy 로딩이라고 생각할 수 있습니다. 클래스로딩이 발생하는 시점과 getInstance()가 호출되는 시점은 다를 수 있습니다. (예, 해당 클래스에 다른 메소드 호출 또는 다른 필드 이용시) 다만 제가 보여드린 예제도 그렇고 작성하신 예제도 모두 getInstance() 메소드 뿐이라 별 차이가 없다고 느껴질 수도 있겠네요.
감사합니다.
많이 사용되는 패턴의 순서를 정한다면 어떤 순서일까요?
0
127
1
@Builder에 대해 사소한 질문
0
64
1
default 기능이 있는 interface와 추상클래스의 차이
0
58
1
실무 코드에 디자인 패턴 적용 시의 '기준'에 대해 조언을 얻고 싶습니다.
0
53
1
데코레이터 패턴, before 가 O(2^n) 인 이유
0
55
0
혹시 다음강의는 언제쯤..
0
354
1
volatile 사용 이유에 대해서 여쭤보고 싶습니다!
0
641
3
Spring Security 의 ProviderManager (AuthenticationManager) 도 옵저버 패턴을 사용하고 있다고 볼 수 있을까요?
0
398
2
싱글톤 패턴을 깨트리는 방법
0
559
1
코드에 약간 오타가 있는거 같습니다.
0
443
1
싱글톤 (Singleton) 패턴 구현 방법 3 - 2번 퀴즈에 대해 질문이 있습니다.
0
574
2
안녕하세요, 강의 순서 질문드립니다.
0
688
1
스프링 시큐리티 WebSecurityConfigurerAdapter deprecated 대체 코드
0
2435
1
팩토리메소드 = 추상팩토리?
2
925
1
중재자 패턴에 관하여~
0
515
1
undo 메소드 작업중에서
1
372
1
익명클래스로 객체 생성시 의문점
0
596
1
mediator패턴에서 객체끼리 순환참조는 어떻게 해결해야할까요
0
486
1
객체간에 this를 넘기는 부분에 관련해 질문이 있습니다..
1
369
1
전략 패턴과 상태 패턴에 관련해서 질문이 있습니다.
0
290
1
플라이웨이트 패턴 3부에서 HashMap 동시성 질문입니다.
0
262
1
enum 이 이른 초기화 방법이 아니라는 것은,
0
509
1
해당 코드가 C# 에선 접근 관련 컴파일 에러가 뜹니다.
0
438
1
설계관련 궁금증이 있습니다.
0
331
0





