我越來越困惑應該使用哪一個來創建一個同步的單例類對象。我知道以下兩種實現方式。如何使Java對象同步?哪個更好,爲什麼?
static volatile PaymentSettings paymentSettings = null;
public static PaymentSettings getInstance() {
if (paymentSettings == null) {
synchronized (PaymentSettings.class) {
if (paymentSettings == null)
paymentSettings = new PaymentSettings();
}
}
return paymentSettings;
}
而且
private static class PaymentSettingsInstanceHolder {
private static PaymentSettings instance = new PaymentSettings();
}
public static PaymentSettings getInstance() {
return PaymentSettingsInstanceHolder.instance;
}
請建議我應該使用哪種方法,爲什麼?
這不會使對象同步。我不確定我甚至知道這意味着什麼。這會創建一個懶惰的初始化單例!第二種方法好得多。 –
通過'synchronized(PaymentSettings.class)'同步可能導致死鎖(很少,但可能),因爲鎖可從外部獲得(也就是說,如果調用者也在該鎖上同步)。如果你喜歡做同步化的惰性init,你可以使用Apache commons中的LazyInitializer。 https://commons.apache.org/proper/commons-lang/javadocs/api-3.1/org/apache/commons/lang3/concurrent/LazyInitializer.html - 除此之外:這兩種方法在施工時間不同(懶惰與非懶惰),而不是他們如何做同步 - 哪一個更好取決於其他方面。 –
更好總是取決於你想達到的目標。你沒有在你的問題中陳述這些問題 –