2010-03-29 8 views
19

Me preguntaba por qué los hilos se despiertan espontáneamente de wait() en java.
¿Es una decisión de diseño? ¿Es un compromiso?¿Por qué los hilos se despiertan espontáneamente de wait()?

EDIT: (. Desde Java concurrencia en la práctica, p 300)

wait siquiera se le permite regresar "falsamente" - no en respuesta a cualquier hilo llamando a notificar.

Además, el estado de los autores:

esto es como una tostadora con una conexión suelta que hace que la campana se apaga cuando el pan está listo, pero también veces cuando no está listo.

Es por eso que siempre se tiene que codificar como

synchronized(this){ 
    while(!condition) 
     wait(); 
    } 
} 

y nunca

synchronized(this){ 
    if(!condition){ 
     wait(); 
    } 
} 

Incluso si las transiciones de condición sólo de false a true.

+0

No, por favor, consulte mi edición .. –

+0

De acuerdo, borré mi comentario, porque parece que tiene razón. –

Respuesta

24

Estos despertares espontáneos también son llamados "activaciones falsas". En la especificación de Java, las activaciones espúreas son permitidas (aunque no recomendadas) para las implementaciones de jvm.

La razón por la que están permitidos se debe a que muchas implementaciones pueden basarse en pthreads (subprocesos POSIX) que tienen este comportamiento. ¿Por qué?

Wikipedia:

Según Programación de David R. Butenhof hebras POSIX ISBN 0-201-63392-2: "Esto significa que cuando esperar una condición variable, la espera puede (de vez en cuando) de retorno cuando no hilo transmitido específicamente o señaló que variable de condición. wakeups espurias pueden sonar extraño, pero en algunos sistemas multiprocesador, haciendo condición wakeup completamente predecible puede ralentizar sustancialmente todas las operaciones variables de condición. Las condiciones carrera que causan espurios activaciones deben ser consideradas como raras."

+0

¡Gracias por el fondo en POSIX, muy informativo! – Ricket

+0

Eso tiene mucho sentido. ¡Gracias! –

+0

Creo que publicamos esto con 60 segundos de diferencia –

10

Es difícil responder a esta definitivamente ya que la especificación del lenguaje Java no establece qué una implementación JVM podría querer hacer esto (sólo especifica que puede, in this section), pero encontré a pretty interesting history of spurious wake-ups on Wikipedia.

El artículo real en alrededor de los hilos POSIX, pero no creo que sea demasiado lejos de un tramo asumir que el roscado en Java fue un poco influenciado por el comportamiento de los hilos POSIX:

activaciones espurias pueden sonar extrañas , pero en algunos sistemas de multiprocesador, hacer que la reactivación de la condición sea completamente predecible podría ralentizar sustancialmente todas las operaciones variables de condición. Las condiciones de carrera que causan despertar espúreas deben considerarse raras.

Esta cita es de David R. Butenhof, que luego pasa a decir:

Aunque había hecho, algunos miembros del grupo de trabajo que sostuvo que era teóricamente posible imaginar que quizá ser tal implementación, esa no era realmente la razón. (Y nunca pudieron demostrarlo). Los hilos POSIX fueron el resultado de una gran tensión entre los programadores en tiempo real pragmáticos y los investigadores en gran parte académicos. Los despertadores espurios son el mecanismo de una camarilla académica de científicos informáticos para asegurarse de que todos tengan que escribir códigos limpios que verifiquen y verifiquen los predicados.

"Pero el (quizás) en gran medida espuria (o al menos arcanamente filosófica) 'eficiencia' argumento se pasaron mejor con las personas en tiempo real, y la verdadera razón fue por lo general relegado al segundo lugar en la lógica.

" He pensado muchas veces sobre cómo puedes construir una implementación correcta y práctica que realmente tenga despertaduras espúreas. Nunca he logrado construir un ejemplo. No significa que no hay uno, sin embargo, y es una buena historia.

Cuestiones relacionadas