私は、再入可能ロックとセマフォ (再入可能ロックと解放/ロック解除メカニズムの入れ子) を理解しようとしています。
release() メソッドは、許可を解放するスレッドが実際にそれを保持しているかどうかをチェックしないため、セマフォを使用するには、より徹底的にテストされたアプリケーションを作成する必要があるようです。テスト コードをテストしたところ、これにより許可の数が最初の制限を超えて増加する可能性があることがわかりました。一方、スレッドが unlock メソッドを呼び出したときに再入可能ロックを保持していない場合は、IllegalMonitorException が発生します。
したがって、バイナリ セマフォで実行できることはすべて ReentrantLock でも実行できるため、バイナリ セマフォを使用する本当の理由はないと言うのが正しいでしょうか。バイナリ セマフォを使用する場合、メソッド コール スタック全体をチェックして、パーミットが以前に取得されたかどうかを確認する必要があります (また、その後の取得の可能性がある場合は、パーミットが解放されたかどうかも確認する必要があります。すぐ )。また、再入可能ロックもオブジェクトごとに 1 つのロックを提供するため、バイナリ セマフォよりも再入可能ロックを優先する方が常に良い考えではないでしょうか?
バイナリ セマフォとミューテックスの違いについて説明している投稿を確認しましたが、Java にミューテックスのようなものはありますか?
ありがとう、チャン。
PS - この質問を別のフォーラム ( http://www.coderanch.com/t/615796/threads/java/reason-prefer-binary-Semaphore-Reentrant ) に投稿しましたが、まだ応答を受け取っていません。ここにも投稿して、何が得られるかを確認したいと思いました。