Dado el siguiente código:Ajuste seguro de subprocesos de una variable (Java)?
public class FooBar {
public static volatile ConcurrentHashMap myConfigData = new ConcurrentHashMap();
}
public class UpdaterThread implements Runnable {
run {
//Query the Data from the DB and Update the FooBar config Data
FooBar.myConfigData = ConfigDataDAO.getLatestConfigFromDB();
}
}
El Hilo Clase actualizará el myConfigData Membervariable regularmente (a través de un ejecutor cada 5 minutos). ¿La configuración de myConfigData en el subproceso "externo" es segura (atómica), o tengo que sincronizar cada operación de lectura y escritura con la variable myConfigData?
EDITAR: La pregunta no es si ConcurrentHashMap es enhebrable (está de acuerdo con javadoc) sino más bien la configuración del mismo ConcurrentHashMap en la variable miembro myConfigData. Esta variable puede leerse y escribirse "a la vez" por varios hilos, por lo que la pregunta es si la configuración es atómica o no. Creo que esto se puede generalizar a "¿La configuración de una variable de referencia Java es atómica o no?".
(también lo hice volátil Este es un tema diferente y no tiene nada que ver con la atomicidad - mi pregunta - sino más bien "visibilidad en otros hilos" y la relación sucede-antes..)
@unknown: ¡el texto citado no dice lo que crees que dice! De hecho, la próxima viñeta en el JLS dice esto: "En ausencia de sincronización explícita, una implementación es gratuita para actualizar la memoria principal en un orden que puede ser sorprendente. Por lo tanto, el programador que prefiere evitar sorpresas debe usar sincronización explícita. " –
@unknown: la única razón por la que el código del OP es seguro es que ha declarado la variable como 'volátil'. –
@Stephen Creo que el punto principal de la pregunta fue sobre la atomicidad de la tarea. Es por eso que cité esta parte de la especificación. Si entiendo correctamente, esta atomicidad está garantizada incluso si no se utiliza volátil. Sin embargo, puede suceder que otros subprocesos nunca vean una actualización de la variable y sigan viendo la referencia "anterior". Sin embargo, un hilo nunca verá "una referencia a algún otro objeto o un valor de referencia dañado". – Wolfgang