C# では、次のコード (このページから) を使用して、スレッド セーフな方法でシングルトン クラスを遅延インスタンス化できます。
class Foo {
private volatile Helper helper = null;
public Helper getHelper() {
if (helper == null) {
lock(this) {
if (helper == null)
helper = new Helper();
}
}
return helper;
}
}
同等のスレッドセーフな Delphi コードは何ですか?
この記事では、Java の Double Checked Locking に関する 2 つの問題についても言及しています。
- ヘルパー参照が新しく作成されたオブジェクトを指すように作成される前に、新しいオブジェクトが構築される可能性があります。つまり、2 つのオブジェクトが作成されます。
- オブジェクトがまだ作成されている間に、ヘルパー参照がメモリのブロックを指すように作成される可能性があります。つまり、不完全なオブジェクトへの参照が返されます。
そのため、前述の記事の C# と Java バージョンのコードはほとんど同じように見えますが、C# バージョンだけが期待どおりに機能します。これら 2 つの問題が Delphi バージョンの Double-Checked Locking にも存在する場合、追加の質問につながるのはどれですか?