2012-04-28 15 views
15

Heinz KabutzさんのJava Specialistニュースレターのエディションでこれを見ましたが、Kabutz博士の記事の残りの部分(そして確かにすべて)は十分に説明されていますが、このコードは、それは意義がある何、もっと重要なのは何をやって、またはされていますJava:ネストされた同期ブロック

public class SomeObject { 
    private Object lock1; 
    private Object lock2; 

    public void doSomething() { 
     synchronized(lock1) { 
      synchronized(lock2) { 
       // ... 
      } 
     } 
    } 
} 

​​ブロックをネストの意味合いは何ですか?これは、doSomething()にしようとする別のスレッドにどのように影響しますか?

+0

このシナリオでは、すべてのスレッドは、内部ロックのスレッドによって解放されるまで、外部ロックでブロックされます。 –

+2

投稿したsnippitは何もしません。 'lock2'を持つことができる唯一のスレッドは' lock1'を持つスレッドです。コードの残りの部分とそのロックが使われていることがわからなければ、答えることは不可能です。 –

+0

あなたはどの記事を読んでいましたか? – Jeffrey

答えて

27

は1つが1が通知/待機を使用している場合は非常に簡単にデッドロックが発生することができます

  1. ネストされたロックに注意しなければならない2つの可能な問題があります。理由を説明します。 http://tutorials.jenkov.com/java-concurrency/nested-monitor-lockout.html

  2. この記事で説明したように、1つは、そうでない場合は、別のデッドロックの可能性があり、別の方法は、同じ2つのオブジェクトをロックしたい場合、彼らは常に同じ順序でそれを行う必要があることに注意する必要があります:How to avoid Nested synchronization and the resulting deadlock

+1

ネストされたモニタのロックアウトに対する解決策があるかどうか尋ねることができますか?内部ロックと外部ロックの両方でwaitを呼び出すことは可能ですか?これを行う方法はありませんか? –

+0

デッドロックには4つの前提条件が必要です。他の関数が同期(エッジ){同期(ノード){}}を有する間に、相互排除(同期(ノード){同期(エッジ){}})、プリエンプティビリティ、循環待ちおよびリソース保持。相互排除を持つだけでは、デッドロックには十分ではありません。好奇心が強い場合は、これをコフマン条件といいます。 http://en.wikipedia。org/wiki/Deadlock_prevention_algorithms –

1

このコードスニペットで問題は発生しません。 しかし、このコードのようなものがあれば、問題はデッドロックの形になるかもしれません。我々は、複数のスレッドが、その後ので、ネストされた同期ブロックでデッドロックがあるかもしれませんこれらのメソッドにアクセスしようとしている場合は、オブジェクトは今反対orders-

public void doSomething() { 
    synchronized(lock1) { 
     synchronized(lock2) { 
      // ... 
     } 
    } 
} 

public void doOtherthing() { 
    synchronized(lock2) { 
     synchronized(lock1) { 
      // ... 
     } 
    } 
} 

でロックされているような方法でsynchronizedブロックを持つ2つのメソッドを持っています。

0

ネストされたモニターのロックアウトでNested Monitor Lockout Tutorial

によれば、スレッド1がロックAを保持しており、1スレッドに 信号を送信するために、ロックAを必要とするスレッド2、スレッド2からの信号を を待ちますデッドロック状態では、2つのスレッドが互いにロックを解除するのを待っています。

デッドロックは、2人の部屋に投獄されているのと同じように、相手の部屋に切り替えたいが、どちらも相手のキーしか持っていない。上司のようにネストされたモニターのロックアウトは部屋で寝るように決められており、誰かが部屋に入ったときにのみ目を覚ますと仮定します。秘書は彼の上司を目覚めさせる責任があります。しかし、ボスはまだ眠っているときに部屋の鍵を保持しているので、秘書は彼を目覚めさせることができませんでした。

関連する問題