0

だから私はこのコードを持っているとしましょう:

public void bar(){
  synchronized(foo){foo.remove(0)}
}

public void doStuff(){
  synchronized(foo){
     bar()
  }
}

同期は、現在のチェーンにこのロックがあり、それを継承していることを認識しますか、それともデッドロックしますか?

4

2 に答える 2

5

同期されたブロックから取得するロックは再入可能です。これはデッドロックにはならず、スレッドは同じオブジェクトのロックを複数回取得できます。

固有のロックと同期を参照してください。

于 2012-04-22T14:23:19.580 に答える
2

マットが言ったように、それはデッドロックにはなりません。

私はそれをどのように見るか

このロックメカニズムは、メソッド呼び出しではなく、制御フローに依存していること。単一のスレッドがステートメントを実行する方法と、スレッドが同期ブロックに遭遇すると、同期署名でオブジェクトのロックを要求します。

それがある場合は、それ以外の場合は、通知を受け取るまでオブジェクトのロックプールで待機します。

doStuff()を実行したスレッドはすでにロックを実行しているため、デッドロックが発生することはありません。

于 2012-04-22T14:35:24.597 に答える