2011-10-20 12 views
3

私は以下のようなコードをいくつか持っています。これはデッドロックを作りますか?デッドロックの作成

private readonly object objectLock = new object(); 

public void MethodA() 
{ 
    lock(objectLock) 
    { 
     MethodB(); 
    } 
} 

public void MethodB() 
{ 
    lock(objectLock) 
    { 
     //do something 
    } 
} 

UPDATE:

答えて

5

デッドロックではありません。同じ同期オブジェクト上の同じスレッドロック。スレッドはネストされたロックを取ることができます。それは単にそれを解放する必要があります。回。

+0

MethodAがMethodBを2回呼び出した場合はどうなりますか?それはまだ大丈夫でしょうか? – Jon

+0

それはまだOKだろう。試しましたか?デッドロックはデッドロックに関与するすべてのスレッドをハングします。 1つのスレッドでデッドロックすることはできません。あなたのアプリには複数のスレッドがありますか? –

+0

申し訳ありませんが、私の質問を更新しました。 2つのスレッド – Jon

3

を実行している2件のスレッドがありません、あなたがデッドロックを有効にするために2つのロックオブジェクトが必要と思います。

+3

と2つのスレッド; p –

+0

申し訳ありませんが、2つのスレッドがあります。 – Jon

10

いいえ - しかし、これは次のようになります。

private readonly object objectLockA = new object(); 
private readonly object objectLockB = new object(); 

public void MethodA() 
{ 
    lock(objectLockA) 
    { 
    lock(objectLockB) 
    { 
     //... 
    } 
    } 
} 

public void MethodB() 
{ 
    lock(objectLockB) 
    { 
    lock(objectLockA) 
    { 
     //do something 
    } 
    } 
} 

あなたは、あなたがデッドロックになるだろう(2つの異なるスレッドから)並行して、両方のメソッドを呼び出す場合...

3

これが唯一のミューテックスの場合関与している、そうではありません。同じスレッドは、同じ回数だけ同じミューテックスをロックする限り、同じミューテックスを複数回ロックすることができます。 MethodAを呼び出す

は同じスレッド上で次の一連の操作を生成します。

  • ロックobjectLock
  • MethodBを呼び出します。
  • ロックobjectLock
  • ロック解除objectLock
  • 出口MethodB
  • ロック解除objectLock

ので、objectLockは二回ロックされ、二回unlocakedが、ないデッドロックはありません。

  • 別のスレッドが、それは単に最初のロックをブロックしますが、デッドロックが発生しませんMethodAを呼び出そうとした場合。
  • MethodBを呼び出すと同じことが起こります。
  • そして、最初のスレッドコールMethodBと他のスレッドがMethodAを呼び出すと、やはり「通常」のブロッキングが発生しますが、デッドロックは発生しません。
関連する問題