我越来越困惑应该使用哪一个来创建一个同步的单例类对象。我知道以下两种实现方式。如何使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 - 除此之外:这两种方法在施工时间不同(懒惰与非懒惰),而不是他们如何做同步 - 哪一个更好取决于其他方面。 –
更好总是取决于你想达到的目标。你没有在你的问题中陈述这些问题 –