これはhttp://www.ibm.com/developerworks/java/library/j-dcl/index.htmlからの Java の例の問題です。
public static Singleton getInstance()
{
if (instance == null) //#4
{
synchronized(Singleton.class) { //#1
if (instance == null) //#2
instance = new Singleton(); //#3
}
}
return instance;
}
コンストラクターが実行される前に #3 がインスタンスを非 null に設定できるため、これは安全ではないようです。したがって、別のスレッドが #4 でインスタンスをチェックすると、null ではなく、適切に構築されていないインスタンスが返されます。
関数変数を使用しても、最適化されていないか、インスタンスに値を設定したくないときに値を設定する方法で実行される可能性があるため、明らかに役に立ちません。
new Singleton();
関数をインスタンスに割り当てる前に完了するのが最も簡単な方法ではないと考えていました。問題は、C++ に関数をインライン化しないように指示するにはどうすればよいかということです。私はそうすべきだと思います Singleton* make_singleton() volatile
が、私は間違っていると確信しています。