Al agregar elementos a la interfaz ya en ejecución se presenta esta excepcion
La sincronización surge debido a la necesidad de evitar que dos o más threads traten de acceder
a los mismos recursos al mismo tiempo. 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. También habría que sincronizar hilos cuando un thread debe esperar a
que estén preparados los datos que le debe suministrar 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 un mismo recurso (un mismo
objeto de una clase, un fichero del disco, etc.) desde dos threads distintos se denominan
secciones críticas. Para sincronizar dos o más threads, hay que utilizar el modificador
synchronized en aquellos métodos del objeto o recurso con los que puedan producirse
situaciones conflictivas. De esta forma Java bloquea, asocia un bloqueo o lock, el recurso
sincronizado. Por ejemplo:
public synchronized void metodoSincronizado() {
...// código de la sección critica
}
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 private o
protected. Así solamente serán accesibles a través de métodos de la clase, los cuales
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 que no funcione 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.
Referencias
REF1
REF2
Multihilo en Java
Raúl Herrero Pascual
Rubén Montero Diez
Programación Orientada a Objetos
Trabajo Teórico
Mayo, 2004