36

私は、再入可能ロックとセマフォ (再入可能ロックと解放/ロック解除メカニズムの入れ子) を理解しようとしています。

release() メソッドは、許可を解放するスレッドが実際にそれを保持しているかどうかをチェックしないため、セマフォを使用するには、より徹底的にテストされたアプリケーションを作成する必要があるようです。テスト コードをテストしたところ、これにより許可の数が最初の制限を超えて増加する可能性があることがわかりました。一方、スレッドが unlock メソッドを呼び出したときに再入可能ロックを保持していない場合は、IllegalMonitorException が発生します。

したがって、バイナリ セマフォで実行できることはすべて ReentrantLock でも実行できるため、バイナリ セマフォを使用する本当の理由はないと言うのが正しいでしょうか。バイナリ セマフォを使用する場合、メソッド コール スタック全体をチェックして、パーミットが以前に取得されたかどうかを確認する必要があります (また、その後の取得の可能性がある場合は、パーミットが解放されたかどうかも確認する必要があります。すぐ )。また、再入可能ロックもオブジェクトごとに 1 つのロックを提供するため、バイナリ セマフォよりも再入可能ロックを優先する方が常に良い考えではないでしょうか?

バイナリ セマフォとミューテックスの違いについて説明している投稿を確認しましたが、Java にミューテックスのようなものはありますか?

ありがとう、チャン。

PS - この質問を別のフォーラム ( http://www.coderanch.com/t/615796/threads/java/reason-prefer-binary-Semaphore-Reentrant ) に投稿しましたが、まだ応答を受け取っていません。ここにも投稿して、何が得られるかを確認したいと思いました。

4

3 に答える 3

36

バイナリ セマフォが実行できることはすべて ReentrantLock でも実行できるため、バイナリ セマフォを使用する本当の理由はありません。

再入可能な相互排除だけが必要な場合は、そうです。ReentrantLock でバイナリ セマフォを使用する理由はありません。何らかの理由で非所有権解放セマンティクスが必要な場合は、明らかにセマフォが唯一の選択肢です。

また、再入可能ロックもオブジェクトごとに 1 つのロックを提供するため、バイナリ セマフォよりも再入可能ロックを優先する方が常に良い考えではないでしょうか?

必要に応じて異なります。前に説明したように、単純なミューテックスが必要な場合は、セマフォを選択しないでください。複数のスレッド (ただし、限られた数) がクリティカル セクションに入ることができる場合は、スレッドの制限またはセマフォのいずれかを使用してこれを行うことができます。

バイナリ セマフォとミューテックスの違いについて説明している投稿を確認しましたが、Java にミューテックスのようなものはありますか?

ReentrantLockおよびsynchronizedJava のミューテックスの例です。

于 2013-07-16T17:56:19.590 に答える