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.