[英]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
? volatile
和DCL
還不足以保證safe publication
嗎? 在這里定義一個本地變量res
然后將其與null
進行比較的目的到底是什么?
編輯:本文解釋了以下內容,以證明需要使用本地 var。 但是我們如何保護自己不返回 null?
此處引入局部變量是一種正確性修復,但只是部分修復:在發布 Singleton 實例和讀取其任何字段之間仍然沒有發生之前。 我們只是保護自己不返回“null”而不是 Singleton 實例
它最大限度地減少了從 volatile 變量instance
中讀取的次數。 易失性變量訪問比非易失性 memory 訪問更昂貴,因為它通常涉及 memory 屏障。 通過將其分配給一個臨時變量,如果 volatile 變量已經初始化,則此代碼僅讀取一次,而不是兩次(一次檢查,一次返回)。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.