-
지연 초기화(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
Beta Was this translation helpful? Give feedback.
Answered by
JoisFe
Apr 4, 2023
Replies: 1 comment
-
|
Beta Was this translation helpful? Give feedback.
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에 물어봤습니다.