如何使Java对象同步?哪个approch更好,为什么?

时间:2015-10-12 07:34:49

标签: java synchronization

我很困惑应该使用哪一个来创建一个同步的单例类对象。我知道以下两种方法来实现它。

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;
}

请建议我应该使用哪种方法以及为什么?

1 个答案:

答案 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;
    }
}