Vous êtes sur la page 1sur 10

Sincronizacin de hilos

Para que dos hilos no accedan a la vez a la


misma zona de datos se utilizan los mtodos
synchronized.
Cuando en una clase hay varios mtodos
synchronized se asegura que no van a ejecutarse
simultneamente (por varios hilos) ms de uno
de ellos
La declaracin de estos mtodos se realiza
colocando la palabra syncrhonized antes del tipo
de dato devuelto por el mtodo.
SINCRONIZACIN DE HILOS
La programacin concurrente puede dar lugar a
muchos errores debido a la utilizacin de
recursos compartidos que pueden ser alterados.
Un monitor impide que varios hilos accedan al
mismo recurso compartido a la vez .
En Java los monitores se consiguen mediante el
uso de la palabra reservada synchronized como
instruccin de bloque.
Como modificador de acceso de mtodos, este
segundo caso se declarara como sigue: public
synchronized void mtodo().
Este mtodo declarado de tal forma garantiza
que solo un hilo de esta clase puede acceder a
este mtodo a la vez.
De tal forma que si un hilo de la misma clase
intenta llamar a este mtodo mientras otro hilo
esta dentro de l, el hilo que realiza la llamada
quedar en estado de bloqueado esperando a
que el primer hilo libere el monitor.
Es muy costoso en tiempo de ejecucin dado
que los dems hilos se detendrn hasta que el
monitor sea liberado.
Y tambin es costoso en tiempo de computacin
ya que como media se ha determinado que un
mtodo sincronizado se ejecuta 6 veces ms
lento que uno que no este sincronizado.
Por tanto es recomendable sincronizar sola y
exclusivamente aquellas partes del cdigo que
formen la seccin critica y nada ms.
SINCRONIZACION DE HILOS
A este fin responde el delimitador de bloque
synchronized, cuyo uso es el siguiente:
synchronized(objeto)
{
...
}
Durante este bloque el objeto estar
sincronizado.

Dentro del manejo de tareas mltiples se necesita
la comunicacin entre ellas y mediante 3
mtodos obtenemos la informacin necesaria
para intercomunicacin, estos mtodos son:

Mtodo Accin
wait() Libera el monitor y pasa al estado
"esperando".
notify() Enva una seal al thread que hizo la
llamada wait(), el thread en cuestin
continua con su ejecucin pasando a
estado "preparado".
notifyAll() si hay varios threads esperando sobre
el objeto este mtodo notifica a
todos.
Mtodos de sincronizacin
El mtodo wait() permite a un thread esperar hasta que otro
cumpla una determinada condicin, cuando esto sucede, el
segundo ejecutar el mtodo notify() para informar al primero
de que algo ha ocurrido y que dicha condicin puede haber sido
satisfecha.
El mtodo nofify() despierta a uno solo de los threads que estn
esperando en un wait() del mismo objeto, mientras que
notifyAll() despierta a todos los threads que estn esperando en
dicho objeto.
La instruccin wait realiza las operaciones de parar el thread y
liberar el bloqueo atmicamente

wait
El esquema recomendado para el uso del wait es:
synchronized void hacerMientrasCondicion (){
while (!condicion)
wait();
Instrucciones a realizar cuando la condicin sea satisfecha
}
Se coloca dentro de un mtodo sincronizado para evitar
que la condicin pueda ser cambiada por otro thread
una vez satisfecha
Se coloca en un bucle porque la salida del wait no
asegura el cumplimiento de la condicin

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

De igual forma el esquema recomendado para el uso de
notify es:
synchronized void cambiarCondicion (){
cambiar la condicin
notifyAll();
}
Se usa notifyAll en lugar de notify cuando puede haber
threads esperando por otras condiciones y con un notify
slo se despierta uno, que puede ser el que est esperando
por una de las condiciones no satisfechas.

Vous aimerez peut-être aussi