6

assert !Thread.holdsLock(lock)デッドロックを回避するために使用する人を見ました 。

これの目的は何ですか?ロック オブジェクトが別のスレッドによって保持されている場合、アサートによってコードはすぐに終了しますか?

4

4 に答える 4

7

メソッドのjavadoc は次のように述べています。

現在のスレッドが指定されたオブジェクトのモニター ロックを保持しているtrue場合にのみ、戻ります。

(私のものを強調)

そのため、アサートは、現在のスレッドが特定のロック オブジェクトのモニター ロックを保持していないことを確認します。

アサートは不変条件をチェックするために使用され、無効にできることに注意してください。デッドロックを防ぐために使用しないでください。そのためには、定期的なifテストを使用する必要があります。

于 2012-06-10T09:25:37.670 に答える
3

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.";
于 2012-06-10T09:30:53.643 に答える
0

Thread.holdsLock(lock)、呼び出し元のスレッドが を所有しているかどうかを確認することのみを目的としlockています。それだけです。

デッドロックを防ぐことはできません(そのような方法があればとても良かったでしょう:))

于 2012-06-10T09:31:18.683 に答える