ホームページ >バックエンド開発 >C++ >マルチスレッドC#で「ロック(これ)」を使用するのはなぜですか?

マルチスレッドC#で「ロック(これ)」を使用するのはなぜですか?

Linda Hamilton
Linda Hamiltonオリジナル
2025-01-31 06:11:09328ブラウズ

Why is using `lock(this)` in multithreaded C# discouraged?

マルチスレッドc#lock(this)

が問題になる理由

Microsoftのドキュメントは、そのオブジェクトが公開されている場合にオブジェクトアクセスを保護するためにlock(this)を使用することに対してアドバイスされています。 この勧告の背後にある理由を探りましょう。

lock(this)

を使用する重要なリスク
  1. 制御されていないロック:公開されているオブジェクトは、任意のコードをthisのロックを取得できることを意味します。これにより、予測不可能な同期の問題への扉が開かれ、マルチスレッドコードが正しく設計およびデバッグするのが大幅に難しくなります。

  2. カプセル化違反:プライベートフィールドと専用のロックオブジェクトの使用が最適です。このアプローチはアクセス制御を強制し、ロックメカニズムを内部に保ち、カプセル化を維持します。 この重要な設計原則を妥協して、ロックの実装を公開します。 lock(this)

  3. の行動の誤解:一般的な誤解は、lockが何らかの形でオブジェクトを読み取り専用にすることです。これは間違っています。オブジェクトは、ロックkeylock(this)としてのみ機能します。 別のスレッドがロックを保持している場合、後続の試行はブロックされますが、オブジェクト自体は変更可能なままです。

  4. 不変の種類のロック:
  5. 文字列のような不変のタイプをロックしないでください。 これらは多くの場合、アプリケーション全体で共有され、デッドロックまたは予期しない動作につながります。 代わりにロックするには、プライベートで可変オブジェクト(専用の

    インスタンスのような)を使用します。 object

    実例:
このC#コードを検討してください:

この例は、問題を強調しています。 はロックを保持しますが、別のスレッドは

を同時に変更することができ、

は本質的に変更を妨げないことを示しています。 保証された保護の欠如は、警告の核となる理由です。

以上がマルチスレッドC#で「ロック(これ)」を使用するのはなぜですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

声明:
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。