2012-02-10 4 views

答えて

3

はいブロックをどのように終了しても(つまり、復帰、ブレーク、スローなど)ロックは解除されます。

詳細はMSDN - lock statement参照してください:ロックキーワード

は、別のスレッドがクリティカルセクションにありながら、一つのスレッドがコードのクリティカルセクションを入力していないことを保証します。
...
ロックキーワードはブロックの先頭にEnterを、ブロックの最後に を終了します。

2

はい、値を計算します(値が式であった場合、これが重要である可能性があります)。その後、ロックが解除されて戻ります。 lock()は、スコープを終了しても自動的にロック解除されます。

1

ブロック実行後にロックが解除されます。

この構文は、using、btwと似ています。 lockがブロックの外側にある唯一の理由は、開始時にロックがあり、終了時にロックが解除されていることを示すことです。

0

いいえ、ロックはの返信後にのみリリースされます。

3

はい、あなたはこのようなものに拡大し、それを考えることができます。

Monitor.Enter(obj); 
try { 
    var result = value; 
} 
finally { 
    Monitor.Exit(obj); 
} 
return result; 

生成されたILを見れば、それはそのようなものです。 valueが式であった場合、ロックを解除する前に評価されます。戻りは、ロックを解除した後に実行されます。

いずれにしてもfinallyブロックが呼び出されるため、ロックが解除されます。

2

lockは、実際にはMonitor.Enter/Monitor.Exitをバックグラウンドで使用しています。あなたのコードの拡張バージョンは、この

Monitor.Enter (SyncRoot); 
try 
{ 
    return value; 
} 
finally { Monitor.Exit (SyncRoot); } 

finallyブロックはメソッドが実際に返す前に実行されることが保証され、実際にあるので、ロックが解除されます。

1

「 int i = 0; オブジェクトo =新しいオブジェクト();

 while (i < 100) 
     { 
      lock (o) 
      { 
       if (i == 10) 
        continue; 
      } 

      ++i; 
     }` 

それは

を続ける が前に前の実行 コンテキストから保存されたロックを獲得するために永遠に待ちます ので、これはデッドロックになります