2012-06-10 17 views
5

Ich sah jemand assert !Thread.holdsLock(lock) verwenden, um Deadlock zu vermeiden.Was ist der Zweck von Thread.holdsLock (lock)?

was ist der Zweck? Wenn das Sperrobjekt von einem anderen Thread gehalten wird, wird Assertion bewirken, dass der Code sofort beendet wird?

+0

Was Sie nicht aus der javadoc verstehen: '' Gibt true zurück, wenn und nur wenn der aktuelle Thread die hält Monitorsperre für das angegebene Objekt. ''? –

Antwort

6

The javadoc of the method sagt:

Returns true, wenn und nur wenn der aktuellen Gewinde der Bildschirmsperre auf dem angegebenen Objekt enthält.

(Hervorhebung von mir)

So prüft die behaupten, dass der aktuelle Thread der Bildschirmsperre des gegebenen Sperrobjekt nicht halten.

Hinweis, dass Asserts verwendet werden, um Invarianten zu überprüfen, und deaktiviert werden können. Sie sollten nicht verwendet werden, um Deadlock zu verhindern. Ein normaler if Test sollte dazu verwendet werden.

3

assert Schlüsselwort wird verwendet, um Fehler zu erfassen; Es sollte niemals zur Steuerung des Programmablaufs verwendet werden. Entweder ist es ein Missverständnis oder jemand macht etwas sehr falsch.
Wahrscheinlicher ist, dass die Person diese assert-Anweisung dort platziert, um zu verhindern, dass Entwickler in diesem Codesegment eine Deadlock-Gefahr hinzufügen.

So:

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."; 
0

Die Thread.holdsLock(lock) wird nur, wenn der aufrufende Thread lock besitzt prüfen soll, das ist es.

Es wird nicht Deadlocks verhindern (wäre so toll gewesen, ein solches Verfahren zu haben :))