44 votes

Déterminer par programme quel thread Java détient un verrou

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é?

29voto

erickson Points 127945

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.

19voto

carrino Points 162

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.

7voto

À partir de la version 1.6, vous pouvez utiliser JMX pour faire toutes sortes de choses intéressantes, y compris la recherche de verrous en attente. Vous ne pouvez pas obtenir l'objet réel, mais vous obtenez la valeur de hachage de la classe et de l'identité (qui n'est pas unique).

Il y a un exemple dans l'un de mes blogs.

4voto

Todd Points 1898

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.

3voto

Chris Kimpton Points 2916

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

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X