マルチスレッドc#lock(this)
で
Microsoftのドキュメントは、そのオブジェクトが公開されている場合にオブジェクトアクセスを保護するためにlock(this)
を使用することに対してアドバイスされています。 この勧告の背後にある理由を探りましょう。
lock(this)
:
制御されていないロック:公開されているオブジェクトは、任意のコードをthis
のロックを取得できることを意味します。これにより、予測不可能な同期の問題への扉が開かれ、マルチスレッドコードが正しく設計およびデバッグするのが大幅に難しくなります。
カプセル化違反:プライベートフィールドと専用のロックオブジェクトの使用が最適です。このアプローチはアクセス制御を強制し、ロックメカニズムを内部に保ち、カプセル化を維持します。 この重要な設計原則を妥協して、ロックの実装を公開します。
lock(this)
の行動の誤解:一般的な誤解は、lock
が何らかの形でオブジェクトを読み取り専用にすることです。これは間違っています。オブジェクトは、ロックkeylock(this)
としてのみ機能します。 別のスレッドがロックを保持している場合、後続の試行はブロックされますが、オブジェクト自体は変更可能なままです。
インスタンスのような)を使用します。
object
この例は、問題を強調しています。 はロックを保持しますが、別のスレッドは
を同時に変更することができ、は本質的に変更を妨げないことを示しています。 保証された保護の欠如は、警告の核となる理由です。
以上がマルチスレッドC#で「ロック(これ)」を使用するのはなぜですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。