3

クラスをロックしている同期メソッド A() があり、その本体で他の 2 つの非同期メソッド B() および C() を呼び出しています。私の質問は、コントロールが A() から B() に移動している間、クラスのロックを解放し、B の実行が終了した後にコントロールが戻ったときに再取得されるかということです。

synchronised A(){
      //will lock be released here?
      b();
      //will lock be reacquired here?
      c();
}

B(){
   will lock be available here?
//do somthing
}

C(){
//do something
}

助けてください。前もって感謝します。

4

2 に答える 2

1

同期ブロック内でロックが解放され、再取得されるのは、waitが呼び出されたときだけです。それ以外の場合、ブロックが終了するまでロックが保持されます。

他のスレッドが B または C を呼び出している場合、それらは A のロックの影響を受けません。A から B を呼び出すスレッドは引き続きロックを保持しますが、A を経由せずに B を呼び出すスレッドにとっては問題ではありません。ロックを取得するために停止します。

于 2014-04-22T16:05:33.667 に答える
0

同期ブロックのスコープはメソッドです。A() 内で発生するメソッド呼び出しは、そのメソッド スコープの一部であるため、いいえ。これは、A() の呼び出しスレッドと他のスレッドの両方が同時に b() または c() にあることができないと言っているわけではありませんが、ロックはメソッド A() で解放されません。

于 2014-04-22T16:04:10.547 に答える