public class Main2 {
public static void main(String[] args) {
new Test2().start();
new Test2().start();
}
}
class Test2 extends Thread {
@Override
synchronized public void run() {
try {
System.out.println("begin wait");
wait();
} catch (Exception ex) {
}
}
}
Como el resultado real de la ejecución de la prueba: comienzan espera, comienzan espera, dos veces a partir de los dos hilos. En contraste con el resultado esperado: begin wait, solo una vez desde uno de los dos hilos porque se llama a wait() dentro del método run() sincronizado. ¿Por qué podría llamar a la sincronización del hilo de corte wait() de Object?Llamada a la espera de Java Object() rompe la sincronización de hilos
¡Eso es mucho!
public class Main3 {
public static void main(String[] args) {
Test3 t = new Test3();
new Thread(t).start();
new Thread(t).start();
}
}
class Test3 implements Runnable {
synchronized public void run() {
try {
System.out.println("begin wait");
wait();
} catch (Exception ex) {
}
}
}
@akf & @Sean Owen
Gracias por sus respuestas. Perdón por mi error, ahora modifiqué el código para colocar la sincronización en la ejecución del mismo objeto(), el resultado se mantuvo: comenzar a esperar, comenzar a esperar, dos veces.
@akf
espera será liberar el bloqueo que sincronizar ha agarrado, y será re- conseguido una vez que se notificó al hilo.
¿Podría elaborar un poco?
¡Gracias por el ejemplo y la referencia de javadoc! – sof
Podría ser bueno tener en cuenta que la elección de qué hilo para despertar es arbitraria. Una buena implementación será justa y notificará los hilos en el orden que ellos llaman wait(), pero eso no es obligatorio. Entonces, la única restricción es que '[N]. el paso 1' sucede antes de '[N]. paso 2', donde N es consistentemente 1 o 2. –
@Mark Peters, ese es un buen punto para hacer, aunque podría no parecer arbitrario (es decir, la evidencia empírica podría intentar convencerlo de que está ordenado), hay no es garantía – akf