2013-02-11 9 views
12

複数のロックオブジェクトが必要ですか?次のクラスを考える

class x 
{ 
    Object lockOne = new Object(); 
    Object lockTwo = new Object(); 

    List<Something> listOne = new List<Something>(); 
    List<Something> listTwo = new List<Something>(); 

    void MethodOne() 
    { 
     lock(lockOne) 
     { 
      // some operation on listOne 
     } 
    } 

    void MethodTwo() 
    { 
     lock(lockTwo) 
     { 
      // some operation on listTwo 
     } 
    } 
} 

MethodOne()MethodTwo()が同時にlistOnelistTwoはとにかく関連していないことを指摘し、異なるスレッドから呼び出すことができると仮定して2つのロックオブジェクトを使用することは正しいです。ロックに関連する操作は、上記のコメントで指定された操作だけです。

+1

:次のコードは以下のコード、少ないオーバーヘッドと誤って間違ったロックを使用することの少ないチャンスで、同じようにうまく動作します独立した。 – assylias

+0

それは常識と呼ばれるべきであり、逆にすることは非常に悪い習慣です。 – Dariusz

+0

[ReaderWriterLock](http://msdn.microsoft.com/en-us/library/system.threading.readerwriterlockslim.aspx)を使用して調べたいことがあります。リストからのみ読み込みを行っている場合は、複数のスレッドが同時に使用することができます( 'List'はスレッドセーフ読み取りを持っています)。ロックの更新を書く必要があると、1つのスレッドしか書き込めず、その後、複数のリーダーが再び開始することができます。 –

答えて

7

はい、正しいです。他のリストが処理されているだけなので、不必要に1つのリストをロックすることを避けます。

+2

修正しますか?はい。悲しい?また、ここでは個別のロックオブジェクトは必要ありません。 – svick

+4

svickが何を言っているかを明確にするために、彼は単一のロックオブジェクトをロックすることを言っているのではなく(ロックオブジェクトをまったく使用しないでください)(http://stackoverflow.com/a/14814386/80274)、リスト自体をロックします。 –

6

ここでは個別のロックオブジェクトは必要ありません。それはロック分割と呼ばれ、二つのオブジェクト&方法がある場合、競合を減らすための良い方法です

class x 
{ 
    List<Something> listOne = new List<Something>(); 
    List<Something> listTwo = new List<Something>(); 

    void MethodOne() 
    { 
     lock (listOne) 
     { 
      // some operation on listOne 
     } 
    } 

    void MethodTwo() 
    { 
     lock (listTwo) 
     { 
      // some operation on listTwo 
     } 
    } 
} 
+10

ベスト・プラクティス(これは、このように表示されています)は、クラスに「プライベート」なアイテムのみをロックすることです。そうでなければ、デッドロックや競合状態のときに外部コードがロックしようとします。 –

関連する問題