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