지연 초기화(lazy initialization)란?
지연 초기화 == ⚔️최선의 조언
성능을 느리게 할 수도 있는 요인
그러면 언제 지연 초기화를 쓰라는 거죠?
예시일반적인 초기화 및 인스턴스 필드의 지연 초기화Nonmember.java public class Nonmember {
private final String name;
public Nonmember(String name) {
this.name = name;
}
}Member.java public class Member {
private final String name;
public Member(String name) {
this.name = name;
}
}Driven code public class MemberShell {
private final Nonmember nonmember = this.createNonmember();
private Member member;
private Nonmember createNonmember() {
return new Nonmember("Anonymous");
}
/**
* 지연 초기화가 초기화 순환성(initialization circularity)을 해소하기 위해서는 `synchronized` 접근자 메서드 사용
*/
public /* synchronized */ Member getMember() {
if (Objects.isNull(member)) {
member = this.createMember();
}
return member;
}
private Member createMember() {
return new Member("corock");
}
}정적 필드용 지연 초기화
public class MemberHolder {
static final Member member = createMember();
private static Member createMember() {
return new Member("CoRock");
}
public static Member getMember() {
return MemberHolder.member;
}
}
이중검사(double-check) 관용구
public class BlueCheck {
private volatile Member member;
private static Member createMember() {
return new Member("CoRock");
}
private Member getMember() {
Member result = member;
// 첫 번째 검사 (락 사용 안 함)
if (Objects.nonNull(result)) {
return result;
}
synchronized(this) {
// 두 번째 검사 (락 사용)
if (Objects.isNull(field)) {
member = createMember();
}
}
return MemberHolder.member;
}
}
cf.
|
![]() |
![]() |
|---|---|
![]() |
![]() |
회고
- 무조건 지연 초기화로 하여 필요할 때만 불러오는 것이 좋은 방법으로만 알고 있었는데, 통념을 깨는 계기가 되었음
References
Answered by
JoisFe
Apr 4, 2023
Replies: 1 comment
|
|
0 replies
Answer selected by
corock
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment




한 번은 동기화 없이 검사하고, 두 번째는 동기화하여 검사하는 방식으로 필드의 값을 총 두 번 검사-> 이중 검사가 왜 ?? 성능을 높여주지 궁금하여 chatgpt에 물어봤습니다.