簡體   English   中英

使用本地變量的 singleton 的安全發布

[英]Safe publication for a singleton using local vars

在閱讀本文時,我遇到了以下解釋安全發布字段的代碼。

public class SafeLocalDCLFactory implements Factory {
  private volatile Singleton instance;

  @Override
  public Singleton getInstance() {
    Singleton res = instance;
    if (res == null) {
      synchronized (this) {
        res = instance;
        if (res == null) {
          res = new Singleton();
          instance = res;
        }
      }
    }
    return res;
  }
}

我的疑問是為什么我們需要在getInstance()中定義本地變量res volatileDCL還不足以保證safe publication嗎? 在這里定義一個本地變量res然后將其與null進行比較的目的到底是什么?

編輯:本文解釋了以下內容,以證明需要使用本地 var。 但是我們如何保護自己不返回 null?

此處引入局部變量是一種正確性修復,但只是部分修復:在發布 Singleton 實例和讀取其任何字段之間仍然沒有發生之前。 我們只是保護自己不返回“null”而不是 Singleton 實例

它最大限度地減少了從 volatile 變量instance中讀取的次數。 易失性變量訪問比非易失性 memory 訪問更昂貴,因為它通常涉及 memory 屏障。 通過將其分配給一個臨時變量,如果 volatile 變量已經初始化,則此代碼僅讀取一次,而不是兩次(一次檢查,一次返回)。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM