2009-07-28 6 views
1

Disons qu'un thread s'exécute dans une fonction synchronisée en Java et qu'un autre thread veut accéder à la même méthode mais il devra attendre que le premier thread soit terminé . Comment le deuxième thread peut-il savoir quel thread a le verrou sur l'objet. Je voudrais imprimer les détails du premier Thread et éventuellement d'où le premier Thread a été initié.Comment obtenir des détails sur Thread qui possède un verrou sur l'objet

Répondre

2

Si vous utilisez java.util.concurrent.locks.ReentrantLock alors une sous-classe peut appeler getOwner.

Vous pouvez également utiliser JMX. Itérer à travers les threads pour trouver le java.lang.management.ThreadInfo avec getLockedMonitors() ou getLockedSynchronizers() approprié.

0

Je crois que ce n'est pas possible de le faire. Cependant, vous pouvez faire quelque chose de similaire avec un certain codage supplémentaire:

public void myFunction() { 
    System.out.println("" + Thread.currentThread() + " entering sync @ myFunction"); 
    synchronized(this) { 
    System.out.println("" + Thread.currentThread() + " entered sync @ myFunction"); 

    ... 

    System.out.println("" + Thread.currentThread() + " leaving sync @ myFunction"); 
    } 
    System.out.println("" + Thread.currentThread() + " left sync @ myFunction"); 
} 
2

Il est un peu délicat, presque ce que Tom Hawtin a écrit, mais vous devez demander l'info explicity du moniteur lors de l'obtention du ThreadInfo dans dumpAllThreads. Quelque chose comme:

Object lock = ... 
    ThreadMXBean mx = ManagementFactory.getThreadMXBean(); 
    ThreadInfo[] allInfo = mx.dumpAllThreads(true, false); 
    for (ThreadInfo threadInfo : allInfo) { 
     MonitorInfo[] monitors = threadInfo.getLockedMonitors(); 
     for (MonitorInfo monitorInfo : monitors) { 
      if (monitorInfo.getIdentityHashCode() == System.identityHashCode(lock)) { 
       StackTraceElement[] stackTrace = threadInfo.getStackTrace(); 
       // use the the Information from threadInfo 
      } 
     } 
    } 
1

Est-ce à des fins de diagnostic, ou est-il pour la fonctionnalité que vous souhaitez utiliser dans le cadre de votre application. Si c'est pour le diagnostic, alors les différentes solutions de journalisation verbeuse dans les autres réponses ici sont probablement suffisantes pour vous lancer. Si vous voulez faire cela dans le cadre de la fonctionnalité, alors vous devriez vraiment utiliser quelque chose de plus robuste et flexible que le mot-clé synchronized, tel que le magicien ReentrantLock mentionné par @Tom.

Questions connexes