El principal problema que encontramos con un código multiproceso es el intercambio de datos, y estoy de acuerdo con el propósito del proceso de paralelismos de concurencia y ocurre "ocasionalmente" que durante el procesamiento paralizado que los hilos necesitan acceso para leer/escribir datos compartidos.
Los java palabra clave sincronizados facilita las siguientes funciones:
Cuenta la JVM para poner un candado en el monitor del objeto o de la pieza del código sincronizado, lo que le da acceso exclusivo a esa parte del código o un objeto .
He aquí un ejemplo de un Singleton:
public class Singleton {
private Singleton INSTANCE;
private Singleton() {
}
public Singleton getInstance() {
if (null == INSTANCE) {
INSTANCE = new Singleton();
}
return INSTANCE;
}
}
Este Singleton no es seguro para subprocesos, si un hilo está tratando de obtener una instancia mientras que otro también está tratando de hacer lo mismo (condición de carrera) se Puede suceder que antes de que el hilo número uno termine la creación de la instancia, el segundo ya haya tenido acceso al método getInstance()
y haya creado su propia instancia de Singleton, lo que significa que en un tiempo T deberíamos tener dos instancias del Singleton (llamado multitón en ese momento).
Para resolver este problema que tenemos para sincronizar el comportamiento creacional del singleton, esto se puede hacer por la palabra clave synchronized
por encima de la sentencia if en la INSTANCE
sí:
public class Singleton {
private Singleton INSTANCE;
private Singleton() {
}
public Singleton getInstance() {
synchronized (Singleton.class) {
if (null == INSTANCE) {
synchronized(Singleton.class) {
Singleton inst = new Singleton();
INSTANCE = inst;
}
}
}
return INSTANCE;
}
}
El resultado es que el primer hilo pregunta a la instancia de Singleton y durante el tiempo de creación, la JVM pondrá un candado en el monitor de la INSTANCIA denegando cualquier acceso a la INSTANCIA hasta que el hilo uno finalice su solicitud.
Hay diferentes maneras de lograr eso también, el libro citado anteriormente es una excelente fuente de aprendizaje, javadoc también.
¡Gracias! Pero, ¿qué significa exactamente la palabra clave sincronizada, es un mutex? Y en diferentes plataformas, dado que los hilos pueden ser diferentes, ¿también será diferente? – Zonata
Es un mutex. Un mutex reentrante. –