2

Java で Singleton 設計パターンを実装する Bill Pugh の方法を試しました。

私はそれについて懸念を持っています。どこか間違っている場合は修正してください。

以下の Bill Pugh のコードを検討してください。

public class Singleton {
        // Private constructor prevents instantiation from other classes
        private Singleton() { }
 
        /**
        * SingletonHolder is loaded on the first execution of Singleton.getInstance()
        * or the first access to SingletonHolder.INSTANCE, not before.
        */
        private static class SingletonHolder {
                public static final Singleton INSTANCE = new Singleton();    // Line 10
        }
 
        public static Singleton getInstance() {
                return SingletonHolder.INSTANCE;    // Line 14
        }
}

「Thread-1」が「return SingletonHolder.INSTANCE;」を呼び出したとします。14号線で初めて。これで、Singleton クラスが Line-10 でインスタンス化されます。

このインスタンス化が完了する前に、「Thread-1」が別のスレッド「Thread-2」によってプリエンプトされるとしましょう。「Thread-2」が「return SingletonHolder.INSTANCE;」を呼び出すと、14号線で、

部分的に構築されたオブジェクトを返しますか?

部分的に構築されたオブジェクトを返す場合、この状況は「順不同の書き込み」になります。上記のケースで私が正しいかどうかお知らせください。また、ご意見をお聞かせください。また、この状況を打破できる方法があれば教えてください。

4

2 に答える 2

0

シングルトンを実装する 1 つの方法。クラスのロード時にインスタンスが作成されます

public class Singleton {
            private Singleton() { }
            public static final Singleton INSTANCE = new Singleton();         
            public static Singleton getInstance() {
                    return INSTANCE;    
            }
    }
于 2013-09-10T09:09:38.553 に答える