2012-05-19 15 views
9

He leído que Thread.sleep() pausará el hilo actualmente en ejecución durante el tiempo especificado, después del cual volverá al estado ejecutable esperando a que se ejecute.llamando a Thread.sleep() desde el contexto sincronizado en Java

Además, si se llama desde el contexto synchronized, sleep() no libera el bloqueo que contiene. Entonces me preguntaba cuándo liberará el bloqueo. Si el subproceso se pone en suspensión, nunca se ejecuta, por lo que siempre mantendrá el bloqueo consigo mismo y, a continuación, la forma en que otros subprocesos ingresan a los métodos/bloques sincronizados.

No estoy seguro de si estoy haciendo una pregunta válida. Pero por favor ayúdame.

Respuesta

16

Así que me preguntaba cuándo liberará la cerradura.

Liberará el bloqueo al salir del bloque synchronized, y no antes.

Si el hilo, se pone en reposo, nunca tiene la oportunidad de ejecutarse, por lo que siempre mantendrá el bloqueo consigo mismo y luego, cómo otros subprocesos pueden ingresar a los métodos/bloques sincronizados.

Sencillamente, otros hilos no será capaz de introducir el código que se sincroniza en el mismo objeto que el hilo de dormir.

En resumen, llamar al Thread.sleep() desde un bloque synchronized probablemente no sea una buena idea.

+2

Realmente, llamar a 'Thread.sleep() 'probablemente no sea una buena idea. Si hay algo que puedes hacer ahora, debes hacerlo ahora. Si tiene que esperar por algo antes de que haya algo que pueda hacer, debe esperar a que algo en lugar de dormir. –

+2

@DavidSchwartz: Estoy de acuerdo. Si bien hay usos legítimos para 'Thread.sleep()', a menudo se usa donde no debería estar. – NPE

+0

Bien explicado, pero diciendo "Para resumir, llamar a Thread.sleep() desde un bloque sincronizado probablemente no sea una buena idea". está yendo demasiado lejos. A veces quieres esperar y mantener el bloqueo. – Jesus

13

Si usa Object.wait en lugar de Thread.sleep, se liberará el bloqueo del bloque sincronizado.