jueves, 17 de abril de 2014

SINCRONIZACIÓN - I

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