マルチスレッド アプリケーションとシングルトン クラスがあります。
public final class Singleton {
private static MyClass mc;
public static final Object getInstance() {
if(mc == null) {
mc = new MyClass();
}
return mc;
}
}
もちろん、これは一般的なマルチスレッド シナリオでは機能しません。ただし、次のシナリオを検討してください。
- 最初はスレッドが1つしかありません
- この 1 つのスレッドが
getInstance()
初めて呼び出し、mc が初期化されます。 - その後、他のすべてのスレッドは最初のスレッドによって開始されます。
私の仮定:
フィールドの初期化とオブジェクトの構築は、他のスレッドを開始するmc
後続のすべての呼び出しの前に発生するため、これは機能するはずです。Thread.start()
そして、Thread.start()
スレッドの for は、そのスレッドの他のすべてのアクションの前に発生します。したがって、すべてのスレッドで正しい値が返されるmc
ように、他のすべてのスレッドですべてのアクションが先行発生します。getInstance()
この仮定は正しいですか?なぜ/なぜしないのですか?