Hay algunas preguntas sobre este tema, pero la mayoría se burla de este problema porque no es la intención de la pregunta.¿Debo sincronizar una variable volátil estática?
Si tengo una volátil estática en mi clase:
private static volatile MyObj obj = null;
y en un método de abajo hago:
public MyObj getMyObj() {
if (obj == null) {
obj = new MyObj();// costly initialisation
}
return obj;
}
necesitaré para sincronizar que exista un sólo hilo escribe en el campo , o ¿alguna escritura será inmediatamente visible para otros hilos que evalúan el obj == null
condicional?
Para decirlo de otra manera: ¿hace volátil tener que sincronizar el acceso a escrituras en una variable estática?
No puedo ir por la ruta del titular: fuerza el singleton en mi clase externa, lo que requiere mucha más reflexión y cambios en el marco general que estoy desarrollando. El problema que necesitaba resolver era la creación atómica de la instancia estática. Usé un método estático y lo declare ('obj') estático final para permitir la asignación atómica y la seguridad concurrente. –
@atc: No, la ruta del titular no fuerza a la clase externa a ser un singleton. No está muy claro lo que quieres decir aquí ... –
Para mayor claridad: esta variable 'volátil estática 'estaba originalmente en una fábrica de objetos que la inyectó en el tiempo de ejecución a las instancias que fue responsable de crear. Esto se debe a los detalles de implementación de dicha var staic ('MyObj' anterior). El uso del constructor 'private' para satisfacer el idioma del titular significaba que no podía mantener las ventajas de la herencia para Object Factory. En lugar de bastardecer el idioma del titular aquí, pensé que iría por la ruta de doble sincronización de verificación ya que tenía la menor fricción con la base de código y se demostró que funcionaba. –