22.07.2013 Views

PDF de la clase 34

PDF de la clase 34

PDF de la clase 34

SHOW MORE
SHOW LESS

You also want an ePaper? Increase the reach of your titles

YUMPU automatically turns print PDFs into web optimized ePapers that Google loves.

Sincronización: el problema<br />

• En muchos casos, un segmento <strong>de</strong> código se pue<strong>de</strong> ejecutar<br />

como "todo o nada" antes <strong>de</strong> po<strong>de</strong>r ejecutar otro hilo.<br />

• Por ejemplo, suponga que está insertando un nuevo objeto<br />

en unVector y que el nuevo elemento supera <strong>la</strong> capacidad<br />

actual. El métodoaddElement() <strong>de</strong>l vector <strong>de</strong>berá copiar el<br />

contenido <strong>de</strong>Vector en una nueva ubicación <strong>de</strong> <strong>la</strong> memoria<br />

con mayor capacidad y, entonces, agregar el nuevo<br />

elemento.<br />

• Si esta operación <strong>la</strong> ejecuta un hilo y ha finalizado<br />

parcialmente cuando otro hilo toma el control e intenta<br />

obtener un elemento <strong>de</strong>l mismo Vector, aparece el<br />

problema: el primer hilo interrumpido <strong>de</strong>berá abandonar el<br />

vector parcialmente copiado en un estado incoherente.<br />

Métodos synchronized<br />

• Java permite <strong>de</strong>c<strong>la</strong>rar un método comosynchronized<br />

para evitar este tipo <strong>de</strong> problemas.<br />

• Una <strong>de</strong>finición <strong>de</strong> método como ésta<br />

public synchronized void foo() {<br />

}<br />

// cuerpo <strong>de</strong>l método<br />

significa quefoo() no pue<strong>de</strong> ser interrumpido por otro método<br />

synchronized que actúe sobre el mismo objeto.<br />

• Si otro hilo intentase ejecutar otro métodosynchronized<br />

en el mismo objeto, este hilo <strong>de</strong>bería esperar a que el<br />

primer método synchronized finalizase.<br />

23<br />

24<br />

12

Hooray! Your file is uploaded and ready to be published.

Saved successfully!

Ooh no, something went wrong!