我遇到了一個單例類{lazy initialization}。代碼如下懶惰初始化具有volatile變量的Singleton類
// Singleton reference for this class
private static volatile FileProperties INSTANCE = null;
public static FileProperties getInstance() {
if (INSTANCE == null) {
synchronized (FileProperties.class) {
if (INSTANCE == null) {
INSTANCE = new FileProperties();
}
}
}
return INSTANCE;
}
我的問題是什麼是我們正在通過使實例作爲揮發性 既然我們已經照顧線程安全的通過同步獲取利益。 在這種情況下是否有揮發性的好處?
請參閱http://jeremymanson.blogspot.co.uk/2008/05/double-checked-locking.html – 2013-05-14 11:51:59
這種雙重檢查的鎖定有一個潛在的錯誤,因爲INSTANCE變量可能被賦予一個非空值*之前* FileProperties的構造函數已完全執行。當然,如果構造函數是空的,這並不重要。 – 2013-05-14 11:55:14
@JakobJenkov也許值得澄清:** IF ** INSTANCE不易變。 – assylias 2013-05-14 11:56:34