domingo, 20 de abril de 2014

SINCRONIZACIÓN - IV

El bucle while de la ñinción get() continúa ejecutándose (avaiaible == false) hasta que el método put() haya suministrado un nuevo valor y lo indique con avalaible = true. En cada iteración del while la ñinción waitQ hace que el hilo que ejecuta el método getQ se detenga hasta que se produzca un mensaje de que algo ha sido cambiado (en este caso con el método notifAUQ ejecutado porputQ). El métodoputQ funciona de fonna similar. Existe también la posibilidad de sincronizar una paite del código de un método sin necesidad de mantener bloqueado el objeto desde el comienzo hasta el final del método. Para ello se utiliza la palabra clave syticronized indicando entre paréntesis el objeto que se desea sincronizar (synchronized(objetoASincronizar)). Por ejemplo si se desea sincronizar el propio thread en una paite del método runQ. el código podría ser:
public void run() {
while(true) {
syncronized(this) { // El objeto a sincronizar es el propio thread
...                  // Código sincronizado
}
try {
sleep(500); // Se detiene el thread durante 0.5 segundos pero el objeto
// es accesible por otros threads al no estar sincronizado
} catch(InterruptedException e) {}
}
}
Un thread puede llamar a un método sincronizado de un objeto para el cual ya posee el bloqueo, volviendo a adquirir el bloqueo. Por ejemplo:
public class VolverAAdquirir {
public synchronized void a() {
b () ;
System.out.println("Estoy en a()");
}
public synchronized void b() {
System.out.println("Estoy en b()");
}
}
El anterior ejemplo obtendrá como resultado:

Estoy en b()
Estoy en a()


debido a que se ha podido acceder al objeto con el método b() al ser el thread que ejecuta el método a() "propietario*' con anterioridad del bloqueo del objeto. La sincronización es un proceso que lleva bastante tiempo a la CPU. luego se debe minimizar su uso. ya que el programa será más lento cuanta más sincronización incorpore.

No hay comentarios:

Publicar un comentario