Pregunta

se menciona en la Memoria de Java Modelo que:Cuando un subproceso salidas de un bloque sincronizado como parte de la liberación de los asociados monitor, el JMM requiere que el local de la memoria caché del procesador se vacían a la memoria principal.Del mismo modo, como parte de la adquisición de la pantalla al entrar en un bloque sincronizado, local cachés están invalidados para que las lecturas posteriores irá directamente a la memoria principal y no en la memoria caché local.

entonces, ¿por qué en la que código debo declarar instancia como volátil, ya que cuando el segundo hilo entra en el bloque de sincronización va a ir directamente a la memoria principal ??

public final class MySingleton {
  private static MySingleton instance = null;
  private MySingleton() { } 
  public static MySingleton getInstance() {
    if (instance == null) {
      synchronized (MySingleton.class) {
        if (instance == null) {
          instance = new MySingleton();
        }
      }
    }
    return instance;
  }
}

Me refiero a cuando otro hilo entra en sincronía bloque y hacer la segunda comprobación se supone que la actualización de la memoria principal como se ha mencionado.

¿Fue útil?

Solución

La condición de carrera es este:

  1. Hilo de Una ve instance == NULL y es que se ejecuta este código instance = new MySingleton();.La escritura instance es visible, pero el que escribe en MySingleton todavía no están.

  2. Subproceso B ve instance != NULL y comienza a trabajar en la instancia.

  3. Subproceso B ahora está trabajando en un objeto cuya construcción no puede ver.

Hacer instance volátiles resuelve el problema, ya que el JDK de la especificación de memoria, como de JDK5, garantiza que escribe no volátil de los objetos no se ven fuera de orden con respecto a la escritura en un volátiles objeto.Por lo que cualquier hilo que se ve instance != NULL hay que ver la propia instancia.

Otros consejos

Debe declararlo volátil de lo contrario, no hay garantía de que dos llamadas a GetInstance () devolverán la misma instancia.

No hay garantía de que se acceda a la memoria principal, solo un valor coherente en caché.I.E. Todos los hilos verán el mismo valor.

BTW: Por supuesto, es mucho más complejo de lo necesario.Todo lo que necesitas es

public enum MySingleton {
     INSTANCE;
}

hace mucho lo mismo.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top