나는이 기사를 읽어 The "Double-Checked Locking is Broken" Declaration, 그것은 말한다게으른 초기화 장면에서 이중 확인 잠금 만 끊어 졌습니까?
두 번 검사 잠금 널리 인용 다중 스레드 환경에서 게으른 초기화를 구현하기위한 효율적인 방법 으로 사용됩니다.
불행하게도, 그것은 ... 자바로 구현 된 플랫폼 독립적 인 방법 에서 안정적으로
그리고이 문서 작동하지 않습니다 Double-checked locking: Clever, but broken를, 그것은 말한다 :
이가 DCL 관용구 설계된 게으른 초기화 지원 ...
내 질문은 다음과 같습니다.
지연 초기화를 시도 할 때 이중 확인 잠금 만 끊었습니까?
아래 코드와 같은 장면에서도 깨졌습니까? (모든 것은 이미 초기화되어 있습니다)?
코드 :
public String refreshJsapiTicket() throws WxErrorException {
if (wxMpConfigStorage.isJsapiTicketExpired()) {
synchronized (wxMpConfigStorage) {
if (wxMpConfigStorage.isJsapiTicketExpired()) {
// ...
// update
wxMpConfigStorage.setJsapiTicket(jsapiTicket, expiresInSeconds);
}
}
}
}
public class WxMpInMemoryConfigStorage implements WxMpConfigStorage {
protected volatile String jsapiTicket;
protected volatile long jsapiTicketExpiresTime;
public synchronized void updateJsapiTicket(String jsapiTicket, int expiresInSeconds) {
this.jsapiTicket = jsapiTicket;
this.jsapiTicketExpiresTime = System.currentTimeMillis() + (expiresInSeconds - 200) * 1000l;
}
}
전체 기사를 읽어보십시오. JDK5 이후, 올바르게 구현되면 이중 검사 잠금이 작동합니다. (즉, 필드가 검사되고 변이 된 것은 '휘발성'으로 선언됩니다.)하지만 많은 경우에 한 단계 더 나아갈 수 있으며 'AtomicReference'와 친구들 만 사용할 수 있습니다. – biziclop
@biziclop 감사합니다. 또 다른 질문, jdk1.4를 사용하면 DCL이 작동하는지 또는 두 번째 질문의 예제 코드에서 작동하지 않습니까? – chanjarster
'AtomicReference' 관용구는 초기화 코드가 한 번만 실행되는 것을 보장 할 수 없습니다. 게으른 초기화는 필요할 때까지 헤비급 초기화를 지연시키기 때문에 주로 'AtomicReference'의 적용 가능성이 상당히 의심 스럽습니다. 반면, * lazy initialization holder class * idiom은 DCL보다 취약성이 적은 동일한 보증을 제공합니다. –