2線以下的代碼在多線程環境中有何不同?多線程中的單例 - 各種場景
代碼1:
public class Singleton {
private Singleton() {}
private static class SingletonHolder {
private static final Singleton INSTANCE = new Singleton();
}
public static Singleton getInstance() {
return SingletonHolder.INSTANCE;
}
}
代碼2:
class Singleton {
private static Singleton uniqueInstance;
private Singleton() { ... }
public static Singleton getInstance() {
if (uniqueInstance == null) {
uniqueInstance = new Singleton();
}
return uniqueInstance;
}
}
爲什麼代碼2不會在多線程環境中工作,當它也已經聲明爲static變量,將得到一次加載類加載&因此它只有一個實例?
謝謝!
如果我從示例2中刪除空檢查條件會怎麼樣?在這種情況下,當多線程嘗試調用getInstance()時,它會看到第1個線程已經初始化它,對嗎?那麼,爲什麼我們說例2不是線程安全的呢? – Mike
這會讓事情變得更糟,因爲單身人士的每個用戶都會得到他們自己的班級實例。該檢查是必需的,但必須以線程安全的方式進行,通常使用'synchronized'。 –
但我宣佈它爲靜態&不是靜態應該只加載一次? – Mike