Déterminer par programmation Java thread détient un verrou
Est-il possible lors de l'exécution par programme vérifiez le nom du Thread qui est maintenant le verrouillage d'un objet donné?
- Veuillez modifier votre titre et de post pour indiquer que vous voulez dire Java. Une étiquette ne doit pas être le seul endroit informations essentielles relatives à la question est posée.
Vous devez vous connecter pour publier un commentaire.
Vous ne pouvez dire si le thread actuel est titulaire d'une normale de verrouillage (
Thread.holdsLock(Objet)
). Vous ne pouvez pas obtenir une référence pour le thread qui a la serrure sans code natif.Cependant, si vous faites quelque chose de compliqué avec les threads, vous voulez probablement pour vous familiariser avec le java.util.simultanées de paquets. Le
ReentrantLock
ne vous permet pas d'obtenir son propriétaire (mais ses une méthode protégée, de sorte que vous auriez à étendre cette). Selon votre application, il se pourrait bien que par l'aide de la simultanéité des paquets, vous verrez que vous n'avez pas besoin d'obtenir le verrou du propriétaire, après tout.Il y a des non-programmatique des méthodes pour trouver la serrure propriétaires, telles que la signalisation de la JVM à l'émission d'un thread dump vers stderr, qui sont utiles pour déterminer la cause de blocages.
Vous pouvez obtenir les verrous détenus par les threads avec la réflexion. Cela ne fonctionne qu'avec la version 1.6 de java.
Sur chacun de ces ThreadInfo objets, il y a LockInfo objets que vous pouvez utiliser le identityHashCode à comparer à la serrure en question.
Vous pouvez, à partir de 1.6, utiliser JMX pour faire toutes sortes de choses intéressantes, y compris trouver un lieu de serrures. Vous ne pouvez pas obtenir l'objet réel, mais vous avez la classe et de l'identité de la valeur de hachage (qui n'est pas unique).
Il y a un exemple dans un de mes blogs.
Exécuter jconsole. Il est inclus dans le SDK Java est exécuté à partir de la ligne de commande. Je ne suis pas sûr de ce système d'exploitation que vous utilisez, mais sur windows, vous pouvez simplement passer le PID du processus java. Il devrait vous aider à trouver le fil qui est à l'origine du problème. Ou, vous pouvez utiliser un commercial profiler comme YourKit ou n'importe quel nombre d'autres profileurs.
Dans la version 1.5, vous pouvez trouver toutes les discussions et obtenir de chacun d'état, par exemple comme ceci:
Fil.getState vous donne les infos à propos de savoir si le thread est BLOQUÉ, en ATTENTE, etc, voir jdk api ThreadState
Vous pouvez vérifier le verrou sur l'objet particulier en appelant
wait()
ounotify()
méthode sur cet objet. Si l'objet n'a pas la serrure, puis il va se jeterllegalMonitorStateException
.2 - En appelant
holdsLock(Object o)
méthode. Ce sera le retour de la valeur booléenne.si c'est ré-entrant verrouillage u peut pouvez vérifier si elle est tenue par le thread courant
Vous pouvez utiliser une variable pour contenir le thread en cours lorsque vous prenez le verrou, puis de l'imprimer si quelqu'un d'autre essaie de l'utiliser.
Laid, mais fonctionne.