Double-checked Locking에 대해 article을 읽었습니다.Double-checked Locking (DCL) 및이를 수정하는 방법
public class MyFactory {
private static final MyFactory instance;
static {
try {
instance = new MyFactory();
} catch (IOException e) {
throw new RuntimeException("Darn, an error's occurred!", e);
}
}
public static MyFactory getInstance() {
return instance;
}
private MyFactory() throws IOException {
// read configuration files...
}
}
저자는 말한다 : 모든 getInstance()
전화에 동기화를 방지하는 방법을 제안 된 방법의
public class MyFactory {
private static MyFactory instance;
public static synchronized MyFactory getInstance() {
if (instance == null)
instance = new MyFactory();
return instance;
}
private MyFactory() {}
}
하나는 클래스 로더를 사용하는 것입니다 : 다음과 같이 설명 된 문제 "... JVM을 이 정적 초기화 코드는 클래스가 처음 참조되고로드 될 때 정확히 한 번 호출됩니다. " 나는 완전히 동의한다. 그러나 나는 다음을 이해하지 못한다. "클래스 로더를 사용하는 것이 일반적으로 게으른 정적 초기화를 다루는 선호하는 방법입니다."
두 번째 코드 스 니펫은 정적 정적 초기화입니까?
우선이 질문에 제공된 예제는 전체 검사가 동기화되므로 이중 검사 잠금을 생성하지 않습니다.나는 당신이 여기에서 문제를 먼저 이해해야한다는 것을 두려워합니다. https://www.javamex.com/tutorials/double_checked_locking.shtml –
@LyjuIEdwinson 첫 번째 코드 스 니펫은이 컨텍스트에서 문제입니다. 인용문 : "... 일부 프로그래머는 모든 읽기에서 동기화 된 액세스 및 "동기화가 느립니다". 그리고 Double-Check Locking은 내가 아는 한 그 해결책 중 하나입니다. –
더 간결하게하기 위해 첫 번째 코드 단편은 해결해야 할 문제입니다. 그것은'getInstance()'의 모든 호출에서 동기화가 수행되기 때문에 느립니다. 'getInstance()'의 모든 호출에서 동기화를 피하는 한 가지 방법은 이중 검사 잠금 방지 패턴을 사용하는 것입니다. 또 다른 방법은 두 번째 코드 스 니펫을 사용하는 것입니다. [article] (https://www.javamex.com/tutorials/double_checked_locking_fixing.shtml)은 두 번째 코드 스 니펫이 지연 정적 초기화라고 주장합니다. 나는 그것이 왜 정적 인 초기 초기화인지 이해하지 못한다. –