0

ブロックレベルでの同期に関するいくつかのポイントをクリアする必要があります。

次の同期ブロックがクラスの同じメソッドにあるとします。

class A{

some_method(){

//BLOCK1
synchronized(OBJ1){
shared code...
}

//BLOCK2
synchronized(OBJ1){
shared code...
}

//BLOCK3
synchronized(OBJ2){
shared code...
}
}

}

次のクエリ:

1)1つのスレッドがOBJ1のロックを取得してblock1に入ると、最初のスレッドがOBJ1のロックを保持している限り、他のスレッドはBlock2に入ることができませんが、他のスレッドは同時にblock3を実行できますか?

2)ブロック1の完了後にブロック2に入った場合、最初のスレッドはOBJ1のロックを再度取得する必要がありますか?

3)最初のスレッドがブロック2のコードをブロック1から呼び出す場合、最初のブロックの実行中に取得したOBJ1のロックを解放して再度取得する必要がありますか、それとも最初のブロックで取得した同じロックが機能しますか?

ここで、block1が1つのクラスのメソッドにあり、blockk2と3が他のクラスのメソッドにあるとします。

4)いくつかの第3クラスのobj(OBJ1、OBJ2)のロックを取得することによって同期が行われているため、ポイント1と同じことが当てはまりますか?

4

3 に答える 3

0
  1. はい、それは正しいです。
  2. はい、ブロックはOBJ1で同期されているため
  3. どういう意味かわかりません。あなたが求めているのが「ロックは再入可能ですか?」であるなら、そうです。すでにオブジェクトをロックしているスレッドは、同じオブジェクトで同期された別のブロックに入ることができます。
  4. はい。コードがどこにあってもかまいません。重要なのは、スレッドにロックがあるかどうかです。
于 2012-05-19T11:00:41.210 に答える
0

1)はい、スレッドがOBJ1ロックを保持している場合、他のスレッドは同じロックを取得できません

2)はい、ロックはブロック1の終わりに解放されるため、再度取得する必要があります。

3)いいえ、スレッドはすでに保持しているロックをブロックしません

4)はい

于 2012-05-19T11:02:40.087 に答える
0

1)はい
2)はい、BLOCK1の外にあるので。

3)ネストされたロックに対して、これと同じロックが保持されます(つまり、すでに取得されています)。

ここで、block1が1つのクラスのメソッドにあり、blockk2と3が他のクラスのメソッドにあると仮定します
>>回答:ロックオブジェクトがメモリ内の同じオブジェクトである限り、結果に違いはありません。

4)はい

于 2012-05-19T11:13:44.660 に答える