我很困惑应该使用哪一个来创建一个同步的单例类对象。我知道以下两种方法来实现它。
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;
}
请建议我应该使用哪种方法以及为什么?
答案 0 :(得分:1)
这两种机制是实现Singleton的常见尝试。
第一个被称为Double-checked locking并且通常被认为是破碎的,尽管你对类的锁定技术可能是可接受的解决方法。
你的第二个是一个整洁的解决方案,但可能会在不需要时创建对象。
如今最好的解决方案是使用enum
。这样可确保仅在需要时创建对象,而不是之前创建。请参阅here,了解为什么这是好的。
final class Singleton {
private Singleton() {
// Make sure only I can create one.
}
private enum Single {
INSTANCE;
// The only instance - ever.
final Singleton s = new Singleton();
}
public static Singleton getInstance() {
// Will force the construction here only.
return Single.INSTANCE.s;
}
}