マルチスレッドプログラミングでの隠された危険の使用を避けてくださいマイクロソフト文書は、自由にの使用を避け、その背後にある理由と潜在的な結果を理解するために明確に推奨されています。
lock(this)
制御されていないロックの問題
オブジェクトが公開されていると仮定し、誰でもその参照を取得できると仮定します。これらの参照のいずれかがオブジェクトのロックに使用された場合、オブジェクトの作成者はそれについて何も知らない場合があります。これは並列実行を複雑にし、事故エラーを引き起こす可能性があります。 カプセル化を破壊し、明確さを減らす 違法な包装原理を使用して、ロックメカニズムはパブリックアクセスにさらされます。これにより、オブジェクトの予想される使用と動作を理解することが困難になります。それどころか、プライベートフィールドでのロックは、注意点のより明確な分離を提供し、不必要な実装の詳細にさらされることなく内部でロックすることを保証できます。
誤解と文字列の危険
いくつかの誤解が不注意にの使用に貢献しています。誤解の1つは、ロックオブジェクト自体が、オブジェクトの変化性や変更を避けるために非常に方法であることです。そうではありません。 ステートメントに渡されたパラメーターオブジェクトは、ロックオブジェクトを識別するキーを識別することのみです。
別のトラップは、文字列をlock(this)
ステートメントのキーとして使用しようとすることです。文字列は変更されておらず、アプリケーション間で共有されているため、このアプローチは予期しないロック競合につながる可能性があります。代わりに、プライベートオブジェクトをキーとして使用して、ロックメカニズムをより適切に制御することをお勧めします。
ケーススタディ:並行治療におけるスレッドセキュリティ
潜在的な問題を説明するために、次のC#コードを検討してください:
lock(this)
lock
メインメソッドでは、複数のスレッドを作成し、各スレッドは
メソッド。ただし、およびメソッドは、オブジェクトを直接的または間接的にロックし、lock
をキーとして使用しようとします。これは、コードが別のスレッドのオブジェクトをロックするときに操作を実行しようとするため、予期しないロック競合とデッドロックにつながります。 (TimeWarpおよびNameChaangeメソッドもロックを使用して、これまたはPerson.Nameを使用してロックオブジェクトとして使用していると想定されています。元のテキストは完全なコードを提供しませんでした)
を使用して、スレッドセキュリティを破壊し、潜在的なデッドロックを作成します。プライベートフィールドパッケージングロックメカニズムを使用し、ステートメントのキーとしてプライベートオブジェクトを使用すると、より堅牢で信頼性の高いスレッド同期方法を提供できます。
以上がなぜ「ロック(これ)がマルチスレッドプログラミングで危険なのですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。