1. ホーム
  2. c#

[解決済み] なぜロックオブジェクトは静的でなければならないのですか?

2022-07-24 01:37:43

質問

マルチスレッドでのロックにプライベートな静的読み取り専用オブジェクトを使用することは非常に一般的です。 private はカプセル化を強化することによってロック オブジェクトへのエントリ ポイントを減らし、その結果、最も重要なものにアクセスできるようになることを理解しています。

しかし、なぜ静的なのでしょうか?

private static readonly object Locker = new object();

最後に、フィールドは私のクラスの中だけで使われるもので、代わりにこれを使うこともできます。

private readonly object Locker = new object();

何かコメントは?

UPDATEです。

例として、このコードを貼り付けました(あくまで例です)。私はこれに静的または非静的なロッカーを使用することができ、どちらも正常に動作するでしょう。以下の回答を考慮すると、私はむしろこのように私のロッカーを定義する必要がありますか?

private readonly object Locker = new object();

そして、以下がそのコードです。

    private int _priceA;
    private int _priceB;
    private EventWaitHandle[] _waithandle;
    private readonly IService _service;

//ctor
public ModuleAViewModel(IService service)
    {
        _service = service;
        _modelA = new ModelA();
        _waithandle = new ManualResetEvent[2];
        _waithandle[0] = new ManualResetEvent(false);
        _waithandle[1] = new ManualResetEvent(false);
        LoadDataByThread();
    }


 private void LoadDataByThread()
        {
            new Thread(() =>
                           {
                               new Thread(() =>
                               {
                                   lock (Locker)
                                   {
                                       _priceA = _service.GetPriceA();
                                   }
                                   _waithandle[0].Set();
                               }).Start();

                               new Thread(() =>
                               {
                                   lock (Locker)
                                   {
                                       _priceB = _service.GetPriceB();
                                   }
                                   _waithandle[1].Set();
                               }).Start();

                               WaitHandle.WaitAll(_waithandle);
                               PriceA = _priceA;
                               PriceB = _priceB;
                           }).Start();
        }

ありがとうございます。

どのように解決するのですか?

マルチスレッドでロックにプライベートな静的リードオンリーオブジェクトを使用することはあまり一般的ではありません"。 を適切な/選択された粒度で使用するのが一般的です。 . 時にはそれは static . より多くの場合、IMO はそうではなく、次のようになります。 インスタンス をベースにしています。

を見るのは主に static ロックは、グローバルキャッシュや、グローバルデータ/シングルトンの遅延ロードのためです。そして後者では、より良い方法があります。 とにかく .

というわけで、それは本当に、どのように Locker はあなたのシナリオでどのように使われていますか?それは そのもの であるものを保護しているのでしょうか?もしそうなら、ロックは静的であるべきです。もし、ロックが インスタンス ベースのものを保護しているのであれば、IMO ではロックは また インスタンスベースであるべきです。