variable tipos thread sincronizar sincronizacion resueltos metodos hilos fuente ejemplos codigo clase acceso java multithreading synchronized thread-synchronization

java - tipos - Dos hilos ejecutando bloque sincronizado simultáneamente.



sincronizar acceso a variable hilos java (3)

La respuesta está en java.lang.Object.wait(long) cuya documentación dice:

[...] Este método hace que el hilo actual (llámelo T) se coloque en el conjunto de espera para este objeto y luego renuncie a todas y cada una de las reclamaciones de sincronización de este objeto . [...]

A continuación se muestra el código donde un Thread entra en un bloque sincronizado, espera 5 segundos y luego sale. He iniciado dos instancias Thread simultáneamente.

La expectativa era que uno de los hilos será el propietario del bloqueo en el objeto sincronizado, y el otro esperará. Después de 5 segundos, cuando el propietario del bloqueo salga, se ejecutará el hilo en espera.

Pero, en realidad, ambos subprocesos ejecutan el bloque sincronizado simultáneamente y también salen al mismo tiempo.

Rendimiento esperado:

Thread-X <timeX> received the lock. Thread-X <timeX+5s> exiting... Thread-Y <timeY> received the lock. Thread-Y <timeY+5s> exiting...

Salida real:

Thread-X <time> received the lock. Thread-Y <time> received the lock. Thread-X <time+5s> exiting... Thread-Y <time+5s> exiting...

¿Me estoy perdiendo de algo?

import java.text.SimpleDateFormat; import java.util.Date; public class Test2 { public static void main(String[] args) { MyRunnable m = new MyRunnable(); Thread t = new Thread(m); Thread t1 = new Thread(m); t.start(); t1.start(); } } class MyRunnable implements Runnable { @Override public void run() { synchronized (this) { try { SimpleDateFormat formatter = new SimpleDateFormat("dd/MM/yyyy HH:mm:ss"); Date date = new Date(System.currentTimeMillis()); System.out.println(Thread.currentThread().getName() + " " + formatter.format(date) + " received the lock."); wait(5000); date = new Date(System.currentTimeMillis()); System.out.println(Thread.currentThread().getName() + " " + formatter.format(date) + " exiting..."); } catch(InterruptedException ie) {} } } }


La siguiente cita de los Tutoriales de Oracle explica la situación:

Cuando se invoca la wait , el hilo libera el bloqueo y suspende la ejecución.

Además, solo un hilo puede ejecutar un bloque synchronized protegido por el mismo objeto. La llamada en wait en su ejemplo libera el bloqueo, permitiendo así que otra hebra adquiera el bloqueo.


Utilizar

Thread.sleep(5000);

JavaDocs para Thread.sleep:

Hace que el subproceso que se está ejecutando en ese momento esté en suspensión (cese temporalmente la ejecución) durante la cantidad especificada de milisegundos, sujeto a la precisión y exactitud de los programadores y temporizadores del sistema. El hilo no pierde la propiedad de ningún monitor.