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) {
while(true) {
syncronized(this) { // El objeto a sincronizar es el
propio thread
... // Código sincronizado
... // 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) {}
// 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 () ;
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()
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