Sincronización de Hilos-2

10
Sincronización Sincronización de hilos de hilos

Transcript of Sincronización de Hilos-2

Page 1: Sincronización de Hilos-2

Sincronización Sincronización de hilosde hilos

Page 2: Sincronización de Hilos-2

Para que dos hilos no accedan a la Para que dos hilos no accedan a la vez a la misma zona de datos se vez a la misma zona de datos se utilizan los métodos synchronized.utilizan los métodos synchronized.

Cuando en una clase hay varios Cuando en una clase hay varios métodos synchronized se asegura que métodos synchronized se asegura que no van a ejecutarse simultáneamente no van a ejecutarse simultáneamente (por varios hilos) más de uno de ellos(por varios hilos) más de uno de ellos

La declaración de estos métodos se La declaración de estos métodos se realiza colocando la palabra realiza colocando la palabra syncrhonized antes del tipo de dato syncrhonized antes del tipo de dato devuelto por el método.devuelto por el método.

Page 3: Sincronización de Hilos-2

SINCRONIZACIÓN DE HILOSSINCRONIZACIÓN DE HILOS

La programación concurrente puede La programación concurrente puede dar lugar a muchos errores debido a dar lugar a muchos errores debido a la utilización de recursos compartidos la utilización de recursos compartidos que pueden ser alterados.que pueden ser alterados.

Un monitor impide que varios hilos Un monitor impide que varios hilos accedan al mismo recurso compartido accedan al mismo recurso compartido a la vez .a la vez .

En Java los monitores se consiguen En Java los monitores se consiguen mediante el uso de la palabra mediante el uso de la palabra reservada reservada synchronized synchronized como como instrucción de bloqueinstrucción de bloque..

Page 4: Sincronización de Hilos-2

Como modificador de acceso de Como modificador de acceso de métodos, este segundo caso se métodos, este segundo caso se declararía como sigue: public declararía como sigue: public synchronized void método().synchronized void método().

Este método declarado de tal forma Este método declarado de tal forma garantiza que solo un hilo de esta clase garantiza que solo un hilo de esta clase puede acceder a este método a la vez.puede acceder a este método a la vez.

De tal forma que si un hilo de la misma De tal forma que si un hilo de la misma clase intenta llamar a este método clase intenta llamar a este método mientras otro hilo esta dentro de él, el mientras otro hilo esta dentro de él, el hilo que realiza la llamada quedará en hilo que realiza la llamada quedará en estado de bloqueado esperando a que el estado de bloqueado esperando a que el primer hilo libere el monitor.primer hilo libere el monitor.

Page 5: Sincronización de Hilos-2

Es muy costoso en tiempo de ejecución Es muy costoso en tiempo de ejecución dado que los demás hilos se detendrán dado que los demás hilos se detendrán hasta que el monitor sea liberado.hasta que el monitor sea liberado.

Y también es costoso en tiempo de Y también es costoso en tiempo de computación ya que como media se ha computación ya que como media se ha determinado que un método sincronizado determinado que un método sincronizado se ejecuta 6 veces más lento que uno que se ejecuta 6 veces más lento que uno que no este sincronizado.no este sincronizado.

Por tanto es recomendable sincronizar Por tanto es recomendable sincronizar sola y exclusivamente aquellas partes del sola y exclusivamente aquellas partes del código que formen la sección critica y código que formen la sección critica y nada más.nada más.

Page 6: Sincronización de Hilos-2

SINCRONIZACION DE HILOSSINCRONIZACION DE HILOS A este fin responde el delimitador de A este fin responde el delimitador de

bloque bloque synchronized, synchronized, cuyo uso es el siguiente::

synchronized(objeto)synchronized(objeto) {{ ...... }} Durante este bloque el objeto estará Durante este bloque el objeto estará

sincronizado.sincronizado.

Page 7: Sincronización de Hilos-2

Dentro del manejo de tareas Dentro del manejo de tareas múltiples se necesita la múltiples se necesita la comunicación entre ellas y mediante comunicación entre ellas y mediante 3 métodos obtenemos la información 3 métodos obtenemos la información necesaria para intercomunicación, necesaria para intercomunicación, estos métodos son:estos métodos son:

MétodoMétodo AcciónAcción

wait()wait() Libera el monitor y pasa al Libera el monitor y pasa al estado "esperando".estado "esperando".

notify() notify() Envía una señal al Envía una señal al threadthread que hizo la llamada que hizo la llamada wait(), wait(), el el threadthread en cuestión en cuestión continua con su ejecución continua con su ejecución pasando a estado pasando a estado "preparado"."preparado".

notifyAll() notifyAll() si hay varios threads si hay varios threads esperando sobre el objeto esperando sobre el objeto este método notifica a este método notifica a todos.todos.

Page 8: Sincronización de Hilos-2

Métodos de Métodos de sincronizaciónsincronización

El método El método wait()wait() permite a un thread esperar permite a un thread esperar hasta que otro cumpla una determinada hasta que otro cumpla una determinada condición, cuando esto sucede, el segundo condición, cuando esto sucede, el segundo ejecutará el método ejecutará el método notify()notify() para informar al para informar al primero de que algo ha ocurrido y que dicha primero de que algo ha ocurrido y que dicha condición condición puede haber sido satisfecha.haber sido satisfecha.

El método El método nofify() despierta a uno solo de los despierta a uno solo de los threads que estén esperando en un threads que estén esperando en un wait() del del mismo objeto, mientras que mismo objeto, mientras que notifyAll()notifyAll() despierta despierta a todos los threads que estén esperando en dicho a todos los threads que estén esperando en dicho objeto.objeto.

La instrucción wait realiza las operaciones de La instrucción wait realiza las operaciones de parar el thread y liberar el bloqueo atómicamenteparar el thread y liberar el bloqueo atómicamente

Page 9: Sincronización de Hilos-2

waitwait

El esquema recomendado para el uso del wait El esquema recomendado para el uso del wait es:es:

synchronized void hacerMientrasCondicion (){synchronized void hacerMientrasCondicion (){while (!condicion)while (!condicion)wait();wait();

Instrucciones a realizar cuando la condición sea Instrucciones a realizar cuando la condición sea satisfechasatisfecha

}}• • Se coloca dentro de un método sincronizado Se coloca dentro de un método sincronizado

para evitar que la condición pueda ser para evitar que la condición pueda ser cambiada por otro thread una vez satisfechacambiada por otro thread una vez satisfecha

• • Se coloca en un bucle porque la salida del wait Se coloca en un bucle porque la salida del wait no asegura el no asegura el cumplimiento de la condicióncumplimiento de la condición

Page 10: Sincronización de Hilos-2

El metodo notify permite indicar el tiempo El metodo notify permite indicar el tiempo máximo de espera máximo de espera void wait ([long millis, ] [int nanos])void wait ([long millis, ] [int nanos])

De igual forma el esquema recomendado para De igual forma el esquema recomendado para el uso de notify es:el uso de notify es:

synchronized void cambiarCondicion (){synchronized void cambiarCondicion (){cambiar la condicióncambiar la condición

notifyAll();notifyAll();}}• • Se usa notifyAll en lugar de notify cuando Se usa notifyAll en lugar de notify cuando

puede haberpuede haberthreads esperando por otras condiciones y con threads esperando por otras condiciones y con

un notifyun notifysólo se despierta uno, que puede ser el que esté sólo se despierta uno, que puede ser el que esté

esperando por una de las condiciones no esperando por una de las condiciones no satisfechas.satisfechas.