[英]Is double-checked locking only broken in a lazy initialization scene?
我读到这篇文章: “双重检查锁定是破碎的”声明 ,它说
Double-Checked Locking被广泛引用并用作在多线程环境中实现延迟初始化的有效方法。
不幸的是,当用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;
}
}
回答你的1:是的。 从Java 5类加载器保证静态字段的单次或一次初始化。 回答你的2:从代码中不清楚,但这取决于你在wxMpConfigStorage.isJsapiTicketExpired()方法中读到的内容。 如果您基于读取非线程安全的东西来决定那么是DCL可能会失败。 但在你的情况下,jsapiTicketExpiresTime是易失性的,所以线程安全,因此DCL将适合你。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.