2012-01-25 15 views
5

Solo tengo una pregunta con respecto a los subprocesos que se ejecutan simultáneamente y el bloqueo que tienen en un objeto. Por lo que entiendo es que el hilo que llama al método wait() entrará en una lista de espera y permite que otro hilo de una lista bloqueada se haga cargo del bloqueo y del objeto (dentro del código sincronizado). Si este hilo que ahora tiene el bloqueo en el objeto llama al método notify(), se despierta el hilo que llamó a wait() y se mueve a la lista bloqueada.Comprensión de varios subprocesos

Qué sucede con el hilo que llama al método notify(). ¿Todavía tiene un bloqueo en el objeto o ahora está en una lista de espera?

respetos

Respuesta

5

Solo un hilo puede mantener el bloqueo de un objeto. Se deben llamar los métodos wait() y notify() mientras el hilo mantiene el bloqueo en el objeto al que llama estos métodos; si no lo hacen (por ejemplo, porque no se sincronizó en el objeto), obtendrá un IllegalMonitorStateException.

Cuando llama al wait(), el hilo abandona el bloqueo y entra en una lista de espera (deja de ejecutarse). Cuando wait() regrese, el hilo habrá obtenido nuevamente el bloqueo. Sin embargo, el hilo que llama a notify() sigue manteniendo el bloqueo, por lo que el hilo de espera no se reanudará antes de que el hilo de notificación salga del bloque o método synchronized para que libere el bloqueo del objeto.

Al llamar al notify(), el hilo no está liberando el bloqueo del objeto.

Una posible secuencia de eventos sería:

  • Thread 1 entra en un bloque de synchronized, la obtención de la cerradura para el objeto
  • Thread 1 llamadas wait() en el objeto, renunciar a la cerradura, detiene la ejecución
  • Tema 2 entra en un bloque synchronized, la obtención de la cerradura para el objeto
  • Tema 2 llamadas notify() en el objeto, pero todavía mantiene el bloqueo
  • Tema 1 se despierta y trata de obtener el bloqueo, pero no puede porque Tema 2 todavía lo tiene (por lo del hilo 1 tiene que esperar a que el bloqueo)
  • Tema 2 salidas del bloque synchronized y libera el bloqueo
  • El subproceso 1 ahora puede obtener el candado y lo devuelve desde wait()
4

El hilo notificador sigue siendo el propietario del bloqueo. Ver doc sección 17.14 (parte inferior de la página):

El método de notificar debe ser llamado por un objeto sólo cuando el hilo actual ya ha bloqueado bloqueo del objeto. Si la espera configurada para el objeto no está vacía, se eliminará un subproceso elegido arbitrariamente del conjunto de espera y se volverá a habilitar para la programación de subprocesos. (Por supuesto, ese hilo no podrá continuar hasta que el hilo actual renuncie al bloqueo del objeto.)

1

No, liberará el bloqueo dejando un bloque sincronizado o regresando de un método sincronizado. No volverá a la lista de espera hasta que vuelva a llamar al wait().

Cuestiones relacionadas