tipos threads thread sincronización que prioridad para los importancia hilos declaracion java multithreading concurrency

threads - Determine programáticamente qué hilo de Java contiene un bloqueo



threads hilos java (8)

Puede verificar el bloqueo en el objeto particular llamando al método wait() o notify() en ese objeto. Si el objeto no mantiene el bloqueo, arrojará llegalMonitorStateException .

2- Llamando al holdsLock(Object o) . Esto devolverá el valor booleano.

¿Es posible, en tiempo de ejecución, verificar programáticamente el nombre del hilo que está sujetando el bloqueo de un objeto dado?


Ejecuta jconsole . Está incluido en Java SDK y se ejecuta desde la línea de comando. No estoy seguro de qué SO estás utilizando, pero en Windows puedes pasarle el PID del proceso de Java. Debería ayudarlo a encontrar el hilo que está causando el problema. O bien, puede utilizar un generador de perfiles comercial como YourKit o cualquier otro perfil.


En 1.5, puede encontrar todos los hilos y obtener el estado de cada uno, por ejemplo, de esta manera:

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

Thread.getState le brinda información acerca de si el hilo está BLOQUEADO, ESPERANDO, etc., consulte jdk api ThreadState


Puedes, desde 1.6, usar JMX para hacer todo tipo de cosas interesantes, incluso encontrar bloqueos retenidos. No puede obtener el objeto real, pero obtiene el valor hash de clase e identidad (que no es único).

Hay un ejemplo en uno de mis weblogs.


Puedes acceder a los bloqueos que tienen los hilos con reflexión. Esto solo funciona con java 1.6.

ThreadMXBean bean = ManagementFactory.getThreadMXBean(); ThreadInfo[] ti = bean.getThreadInfo(bean.getAllThreadIds(), true, true);

En cada uno de estos objetos ThreadInfo hay objetos LockInfo que pueden usar el identityHashCode en ellos para compararlos con el bloqueo en cuestión.


Puede usar una variable para mantener el hilo actual cuando toma el bloqueo, y luego imprimirlo si alguien más está tratando de usarlo.

Thread holderOfLock = null; Object theLock = new Object(); public void doStuff() { if(holderOfLock != null) { //get and print name of holderOfLock-thread or get stacktrace etc. } synchronized (theLock) { holderOfLock = Thread.currentThread(); //do stuff... holderOfLock = null; } }


Solo se puede saber si el hilo actual tiene un bloqueo normal ( Thread.holdsLock(Object) ). No puede obtener una referencia al hilo que tiene el bloqueo sin código nativo.

Sin embargo, si está haciendo algo complicado con el enhebrado, probablemente quiera familiarizarse con los paquetes de java.util.concurrent. ReentrantLock le permite obtener su propietario (pero es un método protegido, por lo que tendría que extender esto). Dependiendo de su aplicación, puede ser que al usar los paquetes de simultaneidad, descubra que no necesita obtener el propietario del bloqueo después de todo.

Existen métodos no programáticos para encontrar a los propietarios del bloqueo, como la señalización de la JVM para emitir un volcado de hilo a stderr, que son útiles para determinar la causa de los interbloqueos.


si se trata de un bloqueo reentrante, puede verificar si está retenido por el hilo actual

final ReentrantLock lock = new ReentrantLock(); lock.isHeldByCurrentThread();