Est-il possible au moment de l'exécution de vérifier par programme le nom du thread qui détient le verrou d'un objet donné?
Réponses
Trop de publicités?Vous ne pouvez dire si le thread actuel est titulaire d'une normale de verrouillage (Thread.holdsLock(Object)
). 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. L' 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 serrures tenues par des fils avec réflexion. Cela ne fonctionne qu'avec Java 1.6.
ThreadMXBean bean = ManagementFactory.getThreadMXBean();
ThreadInfo[] ti = bean.getThreadInfo(bean.getAllThreadIds(), true, true);
Il existe des objets LockInfo sur chacun de ces objets ThreadInfo que vous pouvez utiliser sur le identityHashCode pour les comparer au verrou en question.
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:
Map<Thread,StackTraceElement[]> map = Thread.getAllStackTraces();
for (Map.Entry<Thread, StackTraceElement[]> threadEntry : map.entrySet()) {
log.info("Thread:"+threadEntry.getKey().getName()+":"+threadEntry.getKey().getState());
for (StackTraceElement element : threadEntry.getValue()) {
log.info("--> "+element);
}
}
Fil de discussion.getState vous donne les infos à propos de savoir si le thread est BLOQUÉ, en ATTENTE, etc, voir de l'api du jdk ThreadState