A wait()
solo tiene sentido cuando también hay un notify()
, por lo que siempre se trata de la comunicación entre subprocesos, y eso necesita sincronización para funcionar correctamente. Se podría argumentar que esto debería ser implícito, pero eso realmente no ayudaría, por la siguiente razón:
Semánticamente, nunca solo wait()
. Necesitas alguna condición para ser satsificado, y si no es así, espera hasta que lo sea. Entonces, lo que realmente haces es
if(!condition){
wait();
}
Pero la condición está siendo establecida por un hilo separado, por lo que para que esto funcione correctamente, necesita sincronización.
Un par de cosas más mal con él, donde solo porque su hilo dejó de esperar no significa que la condición que está buscando sea verdadera:
Puede obtener despertadores espurios (lo que significa que un hilo puede despertarse de la espera sin haber recibido una notificación), o
La condición puede establecerse, pero un tercer subproceso vuelve a hacer que la condición sea falsa cuando el subproceso en espera se activa (y vuelve a adquirir el monitor).
Para tratar estos casos, lo que realmente necesita es siempre alguna variación de esto:
synchronized(lock){
while(!condition){
lock.wait();
}
}
Mejor aún, no te metas con las primitivas de sincronización y trabaja con las abstracciones ofrecidas en los java.util.concurrent
paquetes.
Thread.interrupted()
.