2008-09-08 11 views

Respuesta

22

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, es probable que desee familiarizarse con los paquetes de java.util.concurrent. El ReentrantLock le permite obtener su propietario (pero es un método protegido, por lo que tendría que ampliarlo). 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 de los bloqueos, como enviar una señal a la JVM para que emita un volcado de hilo a stderr, que son útiles para determinar la causa de los interbloqueos.

4

Ejecute jconsole. Está incluido en Java SDK y se ejecuta desde la línea de comando. No estoy seguro de qué sistema operativo está usando, pero en Windows puede 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.

7

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

There's an example in one of my weblogs.

3

la 1.5, se pueden encontrar todos los hilos y obtener el estado de cada uno, por ejemplo, así:

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 da información sobre si el hilo está bloqueado, esperando etc. , vea jdk api ThreadState

12

Usted puede conseguir en los bloqueos sostenidos por hilos con la 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 puede utilizar el identityHashCode en ellos para comparar con la cerradura en cuestión.

0

Puede usar una variable para mantener el hilo actual cuando toma el candado, 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; 
    } 
} 
1

Puede comprobar el bloqueo sobre el objeto en particular llamando wait() o notify() método de ese objeto. Si el objeto no mantiene el bloqueo, lanzará llegalMonitorStateException.

2- Al llamar al método holdsLock(Object o). Esto devolverá el valor booleano.

1

si es re bloqueo -entrant u puede puede comprobar si está en manos de hilo actual

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