1
void method1() {
     synchronized(this) {  // Acquires intrinsic lock
      method2();
    }   
}

void method2() {
     synchronized(this) {} // Acquires same lock due to Reentrant synchronization
}

最初のロックは、2 回目に同じロックを取得する同期メソッド 2 を呼び出すメソッド 1 で取得されます。

ここで、同期ブロックが method2() で終了すると、ここで初めてロック解除が行われ、 method1() の同期ブロックに戻り、再びロック解除が 2 度目に行われるときに疑問が生じます。

ReentrantLock のように内部でロック数を管理していますか?

4

2 に答える 2

3

ReentrantLock のように内部でロック数を管理していますか?

はい。JLS セクション 17.1から- 強調鉱山。

Java プログラミング言語は、スレッド間で通信するための複数のメカニズムを提供します。これらの方法の最も基本的なものは、モニターを使用して実装される同期です。Java の各オブジェクトは、スレッドがロックまたはロック解除できるモニターに関連付けられています。一度に 1 つのスレッドだけがモニターのロックを保持できます。そのモニターをロックしようとする他のスレッドは、そのモニターのロックを取得できるまでブロックされます。スレッドtは、特定のモニターを複数回ロックする場合があります。ロックを解除するたびに、1 回のロック操作の効果が逆になります

于 2015-05-17T07:55:34.153 に答える
2

はい、内部的に jdk は再入を追跡します。

オラクルのドキュメントによると:

スレッドは、別のスレッドが所有するロックを取得できないことを思い出してください。ただし、スレッドは既に所有しているロックを取得できます。スレッドが同じロックを複数回取得できるようにすると、再入可能な同期が可能になります。これは、同期されたコードが直接的または間接的に、同期されたコードも含むメソッドを呼び出し、両方のコード セットが同じロックを使用する状況を表します。再入可能な同期がなければ、同期されたコードは、スレッド自体がブロックされるのを避けるために、さらに多くの予防策を講じる必要があります。

詳しくはこちらをご覧ください。

于 2015-05-17T07:55:20.830 に答える