0

タイトルが示すように、現在のスレッドがクラッシュしたときに readwritelock がどうなるか興味があります。

 readlock.lock();
 try {
    ...
 } finally {
   readlock.unlock();
 }

最終ブロックで確実にロックを解除して、突然の中断を防ぐことができます。しかし、readLock.lock() ステートメントがクラッシュした場合、ロックは自動的に解除されるのでしょうか?

ありがとう、

4

3 に答える 3

2
  • readlock.lock例外をスローする場合。
  • ロック操作が失敗します。
  • ロックは取得されていません。
  • 必要ありませんunlock

中に実行時例外がスローされた場合readlock.lock、まだロックが取得されています。lock著者はそれを間違って実装しています。あなたは作者のためにバグレポートを提出することができます:)

于 2012-12-21T03:08:10.927 に答える
1

クラスを参照すると、 (が呼び出されていない)java.util.concurrent.locks.ReentrantReadWriteLock直後にスレッドがクラッシュしても、読み取りロックは解放されません。readlock.lock()readlock.unlock()

ただし、書き込みロックとは異なります。書き込みロックは所有者を定義し、それを取得したスレッドによってのみ解放できます。対照的に、読み取りロックには所有権の概念がなく、読み取りロックを解放するスレッドがそれを取得したスレッドと同じである必要はありません。

readlock.lock()try-finally ステートメントを入れることをお勧めします。

于 2012-12-21T00:06:44.610 に答える
0

「readlock」変数の実装と「スレッドがクラッシュした方法」に依存します。私が見る限り、「readlock」変数は任意のタイプにすることができ、スレッドがクラッシュする方法は複数あります。

参考までに、各 Java オブジェクトには「モニター」があります。複数のスレッドによる共有変数へのアクセスを同期する必要がある場合は、Java チュートリアルのこの章を読むことをお勧めします: http://docs.oracle.com/javase/tutorial/essential/concurrency/index.html

于 2012-12-20T23:59:47.653 に答える