23

複数のスレッドのロックを管理する LockManager があります。スレッドが悪い子である場合があり、それらを強制終了し、LockManager にすべてのロックを解放するように依頼する必要があります。しかし、Java で ReentrantLock を使用しているため、これは不可能であり、別のスレッドが所有するロックを解除することはできません。

ロックを使用せざるを得ません (セマフォは使用できません。これは宿題です)。他のスレッドが所有するロックを解除できる Java Lock の実装はありますか?

これまでのところ、私が検討したオプションは次のとおりです。

  • これを可能にする方法で ReentrantLock を再実装する
  • セマフォとリエントラントロックの間である種のマッピングを行う

あなたが役に立つかもしれない追加の情報源:

4

5 に答える 5

12

一般的な知恵が言う主な理由を発見しました: スレッドを殺さないでください!

ロックは、スレッドを強制終了した場合に発生する可能性のあるリソース リークの 1 つにすぎません。開いているファイルやソケットなどを検討してください。

また、ロックを解除できた場合、そもそもロックがロックされた理由があったことも考慮してください。たとえば、スレッドがデータ構造を部分的に更新した可能性があり、別のスレッドからその構造へのアクセスを許可すると、デバッグが不可能ではないにしても困難な、奇妙で驚異的なプログラム エラーが発生する可能性があります。

この状況に対処する最善の方法は、スレッドに立ち去るように依頼することです。フラグを設定するスレッドに関連付けられたオブジェクトに「stop()」メソッドを追加し (スレッドごとにオブジェクトがありますよね?)、スレッドにこのフラグを定期的にチェックさせ、設定されている場合は終了させます。 .

スレッドが停止フラグをチェックできないような誤動作をしている場合、正しいアプローチは、誤動作しないようにコードを修正することです。

于 2013-05-10T21:58:58.853 に答える
-2

スレッドのコードを次のように単純にラップしてみませんか。

ReentrantLock lock = ... obtain your lock somehow ...
lock.lock();
try {
  ... the "bad boy" code here ...
} finally {
  lock.unlock();
}

次に、スレッドが終了すると (正常に終了するか、「kill」から例外をスローすることによって)、ロックが解放されます。

これは実際に Oracle が ReentrantLock の使用を推奨する方法です: http://docs.oracle.com/javase/7/docs/api/java/util/concurrent/locks/ReentrantLock.html

于 2013-05-10T21:59:38.127 に答える