¿Por qué este programa Java termina a pesar de que aparentemente no debería (y no lo hizo)?

Una operación sensible en mi laboratorio de hoy salió completamente mal. Un actuador en un microscopio electrónico sobrepasó su límite, y después de una cadena de eventos perdí $ 12 millones de equipos. He reducido más de 40K líneas en el módulo defectuoso a esto:

import java.util.*;

class A {
    static Point currentPos = new Point(1,2);
    static class Point {
        int x;
        int y;
        Point(int x, int y) {
            this.x = x;
            this.y = y;
        }
    }
    public static void main(String[] args) {
        new Thread() {
            void f(Point p) {
                synchronized(this) {}
                if (p.x+1 != p.y) {
                    System.out.println(p.x+" "+p.y);
                    System.exit(1);
                }
            }
            @Override
            public void run() {
                while (currentPos == null);
                while (true)
                    f(currentPos);
            }
        }.start();
        while (true)
            currentPos = new Point(currentPos.x+1, currentPos.y+1);
    }
}

Algunas muestras de la salida que estoy recibiendo:

$ java A
145281 145282
$ java A
141373 141374
$ java A
49251 49252
$ java A
47007 47008
$ java A
47427 47428
$ java A
154800 154801
$ java A
34822 34823
$ java A
127271 127272
$ java A
63650 63651

Como no hay aritmética de punto flotante aquí, y todos sabemos que los enteros con signo se comportan bien en el desbordamiento en Java, creo que no hay nada de malo en este código. Sin embargo, a pesar de que la salida indica que el programa no alcanzó la condición de salida, alcanzó la condición de salida (ambas se alcanzarony ¿no alcanzado?). ¿Por qué?

He notado que esto no sucede en algunos entornos. Estoy enOpenJDK 6 en Linux de 64 bits.

Respuestas a la pregunta(5)

Su respuesta a la pregunta