Garantías volátiles y ejecución fuera de orden [duplicado]

Esta pregunta ya tiene una respuesta aquí:

Modelo de memoria Java: variables volátiles y ocurre antes 3 respuestas

EDICION IMPORTANTE Sé sobre el "sucede antes"en el hilo donde están ocurriendo las dos tareas mi pregunta es si sería posibleotro hilo para leer "b" no nulo mientras que "a" sigue siendo nulo. Entonces sé que si estás llamandohazlo() del mismo hilo que el que llamaste anteriormentesetBothNonNull (...) entonces no puede lanzar una NullPointerException. Pero que pasa si uno está llamandohazlo() de otro hilo que el que llamasetBothNonNull (...) ?

Tenga en cuenta que esta pregunta es únicamente sobre elvolatile palabra clave y lavolatile garantías: esno acerca desynchronized palabra clave (así que no responda "debe usar sincronizar" porque no tengo ningún problema que resolver: simplemente quiero entender elvolatile garantías (o falta de garantías) con respecto a la ejecución fuera de orden).

Digamos que tenemos un objeto que contiene dosvolatile Referencias de cadenas que el constructor inicializa como nulas y que solo tenemos una forma de modificar las dos cadenas: llamandosetBoth (...) y que solo podemos establecer sus referencias posteriormente en referencias no nulas (solo el constructor puede establecerlas como nulas).

Por ejemplo (es solo un ejemplo, todavía no hay dudas):

public class SO {

    private volatile String a;
    private volatile String b;

    public SO() {
        a = null;
        b = null;
    }

    public void setBothNonNull( @NotNull final String one, @NotNull final String two ) {
        a = one;
        b = two;
    }

    public String getA() {
        return a;
    }

    public String getB() {
        return b;
    }

}

EnsetBothNoNull (...), la línea que asigna el parámetro no nulo "a" aparece antes de la línea que asigna el parámetro no nulo "b".

Entonces, si hago esto (una vez más, no hay duda, la pregunta viene a continuación):

doIt() {
    if ( so.getB() != null ) {
        System.out.println( so.getA().length );
    }
}

¿Estoy en lo correcto en mi entendimiento de que debido a la ejecución fuera de orden puedo obtener unExcepción de puntero nulo?

En otras palabras: ¿no hay garantía de que, debido a que leo una "b" no nula, leeré una "a" no nula?

Porque debido al fuera de servicio (multi) procesador y la formavolatile funciona "b" podría asignarse antes de "a"?

volatile garantiza que las lecturas posteriores a una escritura siempre verán el último valor escrito, pero aquí hay un "problema" fuera de orden, ¿verdad? (una vez más, el "problema" se hace a propósito para tratar de comprender la semántica delvolatile palabra clave y el modelo de memoria Java, no para resolver un problema).

Respuestas a la pregunta(5)

Su respuesta a la pregunta