threads thread que multitarea multihilos hebras clase java multithreading locking spurious-wakeup

multitarea - que es un thread en java



¿En realidad suceden espurios en Java? (5)

Al ver varias preguntas relacionadas con el bloqueo y (casi) siempre encontrar el ''bucle debido a los términos de los despertadores espurios'' 1 Me pregunto si alguien ha experimentado tal tipo de activación (suponiendo un entorno de hardware / software decente, por ejemplo).

Sé que el término "espurio" no significa una razón aparente, pero ¿cuáles pueden ser las razones para tal tipo de evento?

( 1 Nota: No estoy cuestionando la práctica de bucle).

Editar: una pregunta de ayuda (para aquellos a los que les gustan los ejemplos de código):

Si tengo el siguiente programa y lo ejecuto:

public class Spurious { public static void main(String[] args) { Lock lock = new ReentrantLock(); Condition cond = lock.newCondition(); lock.lock(); try { try { cond.await(); System.out.println("Spurious wakeup!"); } catch (InterruptedException ex) { System.out.println("Just a regular interrupt."); } } finally { lock.unlock(); } } }

¿Qué puedo hacer para despertar esto await espurosamente sin esperar para siempre un evento aleatorio?


El artículo de Wikipedia sobre despertaduras espurias tiene este tidbit:

La función pthread_cond_wait() en Linux se implementa mediante la futex sistema futex . Cada llamada al sistema de bloqueo en Linux vuelve abruptamente con EINTR cuando el proceso recibe una señal. ... pthread_cond_wait() no puede reiniciar la espera porque puede perder una activación real en el poco tiempo que estuvo fuera de la futex sistema futex . Esta condición de carrera solo se puede evitar si el que llama verifica un invariante. Una señal POSIX generará, por lo tanto, una activación espuria.

Resumen : si se señaliza un proceso de Linux, sus hilos de espera disfrutarán cada uno de una agradable y caliente activación espuria .

Lo compro. Esa es una píldora más fácil de tragar que la razón por lo general vaga "por su rendimiento" que a menudo se da.


Para responder la pregunta en el titile - ¡Sí! sucede. Aunque el artículo de Wiki menciona un buen trato sobre los despertadores espurios, una buena explicación de lo mismo que encontré es la siguiente:

Solo piense en ello ... como cualquier código, el programador de hilos puede experimentar un apagón temporal debido a que algo anormal sucede en el hardware / software subyacente. Por supuesto, se debe tener cuidado de que esto ocurra lo más raro posible, pero como no existe un software 100% robusto, es razonable suponer que esto puede suceder y tener cuidado con la elegante recuperación en caso de que el planificador detecte esto (p. Ej. observando latidos cardíacos faltantes).

Ahora, ¿cómo podría recuperarse el programador, teniendo en cuenta que durante el apagón podría pasar por alto algunas señales destinadas a notificar los hilos de espera? Si el programador no hace nada, los hilos mencionados "desafortunados" simplemente se colgarán, esperando para siempre; para evitar esto, el programador simplemente enviaría una señal a todos los hilos de espera.

Esto hace que sea necesario establecer un "contrato" que el hilo de espera puede ser notificado sin una razón. Para ser precisos, habría una razón, el apagón del programador, pero dado que el hilo está diseñado (por una buena razón) para no tener en cuenta los detalles de la implementación interna del programador, es probable que esta razón se presente como "espuria".

Estaba leyendo esta respuesta de Source y la encontré lo suficientemente razonable. Lea también

Despertadores espurios en Java y cómo evitarlos .


Solo para agregar esto. Sí, sucede y pasé tres días buscando la causa de un problema de subprocesos múltiples en una máquina de 24 núcleos (JDK 6). 4 de 10 ejecuciones experimentaron eso sin ningún patrón. Esto nunca sucedió en 2 núcleos u 8 núcleos.

Estudié un poco de material en línea y este no es un problema de Java, sino un comportamiento general raro pero esperado.


Tengo un sistema de producción que exhibe este comportamiento. Un hilo espera una señal de que hay un mensaje en la cola. En períodos ocupados, hasta el 20% de los despertadores son espurios (es decir, cuando se despierta no hay nada en la cola). Este hilo es el único consumidor de los mensajes. Se ejecuta en una caja Linux SLES-10 de 8 procesadores y está construido con GCC 4.1.2. Los mensajes provienen de una fuente externa y se procesan de forma asíncrona porque existen problemas si mi sistema no los lee con la suficiente rapidez.


Hace un tiempo, Cameron Purdy escribió una publicación en el blog sobre ser golpeado por el falso problema de activación. Entonces sí, sucede

Supongo que está en la especificación (como una posibilidad) debido a las limitaciones de algunas de las plataformas en las que se implementa Java. ¡aunque puedo estar equivocado!