コード検査: ダブルチェックロックパターンの誤った実装の可能性: チェックされたフィールドへの読み取りアクセス。
次のコードを考えてみましょう。
Init()
が Foo
の状態を初期化するために使用される方法であると仮定すると、上記のコードはマルチスレッド環境では期待通りに機能しない可能性があります。
1 つのスレッドが _instance = new Foo();
を実行したがまだ _instance.Init();
を実行していない場合があります。この時点で他のスレッドが GetValue()
を呼び出すと、メソッドは _instance
が null ではないことを確認し、初期化されていないインスタンスが呼び出し元に返されます。
上記のコードでこの問題を解決するには、2 つの方法があります。
最初の、最も明白なことは、Init()
の内容をプライベートコンストラクターに移動することです。
2 つ目は、チェックされていない変数で初期化を実行してから、チェックされた変数に割り当てることです。これにより、問題が解消されます。このようにして _instance
はすでに初期化されているときだけ null にはなりません。上記の例の lock
ステートメントのコードは、次のように書き直すことができます。
StackOverflow に関するこの回答(英語)は、このパターンに関する他の考えられる問題と、なぜ _instance
を volatile
と宣言すべきかを説明します。
関連ページ:
![](https://resources.jetbrains.com/help/img/rider/2024.1/code_analysis_target_framework.png)
コードインスペクション設定を構成する
設計時コードインスペクションを構成する:デフォルトでは、JetBrains Rider はサポートされている言語に対応するすべてのファイルで設計時コードインスペクションを有効にします。必要に応じて、無効にすることができます。設計時コードインスペクションが有効かどうかにかかわらず、コードインスペクションを特定の範囲でいつでも実行できます。「鉛筆」ウィジェットを使用して、エディターから直接インスペクション設定をすばやく調整するか、設定でより詳細な構成を行うことができます。を押すか、メニューから(W...
![](https://pleiades.io/icons/rider.png)
コード検査: ダブルチェックロックパターンの誤った実装の可能性: チェックされたフィールドへの可能な複数の書き込みアクセス。| JetBrains Rider ドキュメント
次のコードを考えてみましょう。public class Foo { private static Foo instance; private static readonly object padlock = new object(); public static Foo Get() { if (instance == null) { lock (padlock) { if (instance == null) { instance = new Foo(); } } } return instan...