繁体   English   中英

双重检查锁定是否仅在延迟初始化场景中被破坏?

[英]Is double-checked locking only broken in a lazy initialization scene?

我读到这篇文章: “双重检查锁定是破碎的”声明 ,它说

Double-Checked Locking被广泛引用并用作在多线程环境中实现延迟初始化的有效方法。

不幸的是,当用Java实现时,它不能以独立于平台的方式可靠地工作......

这篇文章: 双重检查锁定:聪明,但破碎 ,它说:

DCL习惯用于支持延迟初始化......

我的问题是:

  1. 在尝试进行延迟初始化时,双重检查锁定是否仅被破坏?

  2. 它是否也像下面的代码一样被破坏了(所有的东西都已经初始化了)?

码:

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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM