Prueba de seguridad de inicialización de campos finales

Estoy tratando de probar simplemente la seguridad de inicialización de los campos finales como lo garantiza el JLS. Es para un artículo que estoy escribiendo. Sin embargo, no puedo lograr que 'falle' en función de mi código actual. ¿Alguien puede decirme qué estoy haciendo mal, o si esto es algo que tengo que correr una y otra vez y luego ver un fallo con un momento desafortunado?

Aquí está mi código:

public class TestClass {

    final int x;
    int y;
    static TestClass f;

    public TestClass() {
        x = 3;
        y = 4;
    }

    static void writer() {
        TestClass.f = new TestClass();
    }

    static void reader() {
        if (TestClass.f != null) {
            int i = TestClass.f.x; // guaranteed to see 3
            int j = TestClass.f.y; // could see 0

            System.out.println("i = " + i);
            System.out.println("j = " + j);
        }
    }
}

y mis hilos lo llaman así:

public class TestClient {

    public static void main(String[] args) {

        for (int i = 0; i < 10000; i++) {
            Thread writer = new Thread(new Runnable() {
                @Override
                public void run() {
                    TestClass.writer();
                }
            });

            writer.start();
        }

        for (int i = 0; i < 10000; i++) {
            Thread reader = new Thread(new Runnable() {
                @Override
                public void run() {
                    TestClass.reader();
                }
            });

            reader.start();
        }
    }
}

He ejecutado este escenario muchas, muchas veces. Mis bucles actuales están generando 10,000 hilos, pero he terminado con este 1000, 100000 e incluso un millón. Todavía no falla. Siempre veo 3 y 4 para ambos valores. ¿Cómo puedo hacer que esto falle?

Respuestas a la pregunta(8)

Su respuesta a la pregunta