Como obter detalhes de Thread que possuem um bloqueio no object

Digamos que um Thread esteja sendo executado dentro de uma Synchronized Function em Java e outro Thread queira acessar o mesmo método, mas ele terá que esperar até que o primeiro Thread seja concluído. Como pode o segundo Thread saber qual Thread está tendo o bloqueio no object. Gostaria de imprimir os detalhes do primeiro Thread e possivelmente de onde o primeiro Thread foi iniciado.

Se você estiver usando java.util.concurrent.locks.ReentrantLock , uma subclass poderá chamar getOwner .

Como alternativa, você pode usar o JMX. Itere através de threads para encontrar o java.lang.management.ThreadInfo com getLockedMonitors() ou getLockedSynchronizers() .

É um pouco complicado, quase o que Tom Hawtin escreveu, mas você deve explicitamente solicitar as informações do monitor ao obter o ThreadInfo em dumpAllThreads. Algo como:

  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 } } } 

Isso é para fins de diagnóstico ou para funcionalidades que você deseja usar como parte de seu aplicativo. Se é para diagnósticos, então as várias soluções de registro verboso nas outras respostas aqui são provavelmente o suficiente para você seguir em frente. Se você quiser fazer isso como parte da funcionalidade, você realmente deve usar algo mais robusto e flexível do que a palavra synchronized chave synchronized , como a magia ReentrantLock mencionada pela @Tom.

Eu acredito que não é possível fazer isso. No entanto, você pode fazer algo semelhante com alguma codificação extra:

 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"); }