La sincronización nace de la necesidad de evitar que dos o más threads traten de acceder a los
mismos recursos al mismo tiempo. Así. por ejemplo, si un thread tratara de escribir en un fichero, y
otro thread estuviera al mismo tiempo tratando de borrar dicho fichero, se produciría una situación
no deseada. Otra situación en la que hay que sincronizar threads se produce cuando un thread debe
esperar a que estén preparados los datos que le debe suministrar el otro thread. Para solucionar
estos tipos de problemas es importante poder sincronizar los distintos threads.
Las secciones de código de un programa que acceden a mi mismo recurso (un mismo objeto
de una clase, un fichero del disco, etc.) desde dos threads distintos se denominan secciones criticas
(critical sections). Para sincronizar dos o más threads. hay que utilizar el modificador synchronized
en aquellos métodos del objeto-recurso con los que puedan producirse situaciones conflictivas. De
esta fonna. Java bloquea (asocia un bloqueo o lock) con el recurso sincronizado. Por ejemplo:
public synchronized
void metodoSincronizado() {
...II accediendo por ejemplo a las variables
de un objeto
}
La sincronización previene las interferencias solamente sobre un tipo de recurso: la memoria
reservada para un objeto. Cuando se prevea que unas determinadas variables de una clase pueden
tener problemas de sincronización, se deberán declarar como prívate (o protected). De esta fonna
sólo estarán accesibles a través de métodos de la clase, que deberán estar sincronizados.
Es muy importante tener en cuenta que si se sincronizan algunos métodos de un objeto pero
otros no. el programa puede no funcionar correctamente. La razón es que los métodos no
sincronizados pueden acceder libremente a las variables miembro, ignorando el bloqueo del objeto.
Sólo los métodos sincronizados comprueban si un objeto está bloqueado. Por lo tanto, todos los
métodos que accedan a un recurso compartido deben ser declarados synchronized. De esta fonna. si
algún método accede a un determinado recurso. Java bloquea dicho recurso, de fonna que el resto
de threads no puedan acceder al mismo hasta que el primero en acceder termine de realizar su tarea.
Bloquear un recurso u objeto significa que sobre ese objeto no pueden actuar simultáneamente dos
métodos sincronizados.
No hay comentarios:
Publicar un comentario