¿Es posible en tiempo de ejecución comprobar mediante programación el nombre del hilo que está sujetando el bloqueo de un objeto dado?Determine programáticamente qué hilo de Java contiene un bloqueo
Respuesta
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.
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.
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).
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
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.
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;
}
}
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.
si es re bloqueo -entrant u puede puede comprobar si está en manos de hilo actual
final ReentrantLock lock = new ReentrantLock();
lock.isHeldByCurrentThread();
- 1. ¿Qué hilo obtendrá el bloqueo?
- 2. Bloqueo de autorrotación, programáticamente
- 3. bloqueo intrínseco de hilo
- 4. Enhebrado de Python. ¿Cómo bloqueo un hilo?
- 5. Cola de bloqueo de Java que contiene solo elementos únicos
- 6. Determine programáticamente qué JDK/JRE están instalados en mi caja
- 7. Determine el controlador de dominio actual programáticamente
- 8. Bloqueo Mutex: ¿qué significa "bloqueo"?
- 9. Volcado de hilo Java: BLOQUEADO hilo sin "esperar para bloquear ..."
- 10. Bloqueo de archivos Java
- 11. bloqueo de subproceso Java
- 12. ¿Es posible determinar el hilo que contiene un mutex?
- 13. ¿Por qué FileChannel en Java no es de no bloqueo?
- 14. SQLiteDatabase multi-hilo patrón de bloqueo
- 15. bloqueo gama en java
- 16. Diccionario de bloqueo dentro del mismo hilo
- 17. cómo matar un hilo que está esperando una llamada de función de bloqueo en Java?
- 18. ¿Cómo detener un hilo esperando en una operación de bloqueo de lectura en Java?
- 19. ¿Puedo ejecutar un hilo dentro de un hilo en java?
- 20. ¿Qué define un hilo "activo"?
- 21. Verificando programáticamente si se establece un código de bloqueo
- 22. Determine programáticamente el tiempo de espera de la sesión de Java
- 23. Cómo suspender un hilo de bloqueo sin Thread.Suspend obsoleto?
- 24. Detener un hilo atascado en una llamada de bloqueo
- 25. ¿Envolviendo llamadas asincrónicas en un hilo de bloqueo síncrono?
- 26. ¿Qué hilo Java está acaparando la CPU?
- 27. Determine qué versión de OpenCV
- 28. Detener un hilo en Java?
- 29. ¿Qué significa "unirse" a un hilo?
- 30. ¿Cómo puedo matar un hilo de otro hilo en Java?
Modifique su título y post para indicar que quiere decir Java. Una etiqueta no debe ser el único lugar donde se coloca la información crítica relacionada con la pregunta. –