2009-12-09 1 views
16

可能性の重複:私が見た「スレッドセーフ」のコード例の全てにおいて
Difference between lock(locker) and lock(variable_which_I_am_using)別々のオブジェクトでロックが実行されるのはなぜですか?

、彼らは別のダミーオブジェクトをロックします。問題のデータに対して直接ロックを実行するのはなぜですか?

+0

大きな質問ですが、これも私の最初の考えでした。 – Russell

+1

人々が探している答えを見つけやすくするために、この質問を閉じてはいけません。 @Bill、いわゆる正確な重複質問は、不自然な表題と言葉であり、この質問とは異なり基本的な質問を明確に述べていません。私は、この質問が検索で注目を集める可能性が高いと考えています。私は再開することを決意しました。 – Ash

答えて

18

ダミーオブジェクトをロックすると、他の誰もそのオブジェクトをロックしていないことが保証されます。

データをロックして、同じデータが外部に見える場合、その保証は失われます。例:

public class MyObject 
{ 
    public void SharedMethod() 
    { 
     lock (this) 
     { 
      // Do stuff 
     } 
    } 
} 

class Program 
{ 
    static void Main(string[] args) 
    { 
     MyObject o = new MyObject(); 

     lock (o) 
     { 
      new Thread(() => 
      { 
       // Gets blocked 2s because of external lock 
       o.SharedMethod(); 
      }).Start(); 

      Thread.Sleep(2000); 
     } 
    } 
} 
+0

問題の良い例です。 – RichardOD

+0

私はそれを得ると思います。別のダミーオブジェクトがある場合は、使用したいオブジェクトをロックして、何もしないようにしていませんか? – RCIX

+0

私は、あなたが何かをクロックする必要があるオブジェクト上のメソッドを呼び出そうとすると、意味します。 – RCIX

2

Eric Gunnersonのブログには、これに関するいくつかの素晴らしいことがあります。 hereおよびhereを参照してください。

8

Jeff Richter(CLR Via C#の著者)は、なぜこの記事のSafe Thread Synchronizationについて説明していますか?

具体的には、この記事では「なぜ偉大なアイデアがそれほど大きくないのか」というセクションがあなたの質問に答えています。

実際にはCLR Via C#という本の章です。

要約すると、「synclock」オブジェクトとしてプライベートオブジェクトを使用すると、クラスがクラスに必要なロックをカプセル化して制御できます。したがって、クラスを使用するクライアントの数に関係なく、ロックは一貫して正しく実行されます。

+0

+1。私は彼の本を指摘しようとしていましたが、この記事は事実上同じです! – RichardOD

+0

特定の操作中にオブジェクトをロックする必要があり、その間にロックを解除しないで外部コードで2つ以上の操作を実行する必要がある場合、オブジェクトはロックを公開するか、解放して解放する必要があります。どちらも公開しないと、外部コードが必要とすることを適切に行うことが不可能になります。 – supercat

関連する問題