我读了这篇文章:“双重检查锁定被破坏”声明,它说
双重检查锁定被广泛引用并用作在多线程环境中实现延迟初始化的有效方法。
不幸的是,当用 Java 实现时,它不能以独立于平台的方式可靠地工作......
而这篇文章:双重检查锁定:聪明,但坏了,它说:
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;
}
}