La variable volátil de Java no se comporta correctamente.

public class MyThread
{
    volatile static int i;

    public static class myT extends Thread
    {
        public void run ()
        {
            int j = 0;
            while(j<1000000){
                i++;
                j++;
            }
        }
    }

    public static void main (String[] argv)
    throws InterruptedException{
            i = 0;

            Thread my1 = new myT();
            Thread my2 = new myT();
            my1.start();
            my2.start();

            my1.join();
            my2.join();

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

Dado que las compilaciones volátiles ocurren antes de la relación, el valor final de i debería ser estrictamente 2000000. Sin embargo, el resultado real no es diferente de estar sin volatile para la variable i. ¿Alguien puede explicar por qué no funciona aquí? Dado que i se declara volátil, debe protegerse de la inconsistencia de la memoria.

Respuestas a la pregunta(1)

Su respuesta a la pregunta