assert !Thread.holdsLock(lock)
デッドロックを回避するために使用する人を見ました
。
これの目的は何ですか?ロック オブジェクトが別のスレッドによって保持されている場合、アサートによってコードはすぐに終了しますか?
assert !Thread.holdsLock(lock)
デッドロックを回避するために使用する人を見ました
。
これの目的は何ですか?ロック オブジェクトが別のスレッドによって保持されている場合、アサートによってコードはすぐに終了しますか?
メソッドのjavadoc は次のように述べています。
現在のスレッドが指定されたオブジェクトのモニター ロックを保持している
true
場合にのみ、戻ります。
(私のものを強調)
そのため、アサートは、現在のスレッドが特定のロック オブジェクトのモニター ロックを保持していないことを確認します。
アサートは不変条件をチェックするために使用され、無効にできることに注意してください。デッドロックを防ぐために使用しないでください。そのためには、定期的なif
テストを使用する必要があります。
assert
キーワードはバグをキャプチャするために使用されます。プログラム フローの制御には使用しないでください。つまり、それは誤解であるか、誰かが非常に間違ったことをしているのです。
おそらく、開発者がそのコード セグメントにデッドロックの危険を追加するのを防ぐために、その assert ステートメントをそこに置いたのでしょう。
このような:
assert !Thread.holdsLock(lock) :
"Don't call this method while holding the lock." +
"This method tries to acquire lock2 and that may cause a deadlock.";
はThread.holdsLock(lock)
、呼び出し元のスレッドが を所有しているかどうかを確認することのみを目的としlock
ています。それだけです。
デッドロックを防ぐことはできません(そのような方法があればとても良かったでしょう:))