title: Why does this Java program terminate despite that apparently it shouldn't (and didn't)?
body: <p>A sensitive operation in my lab today went completely wrong. An actuator on an electron microscope went over its boundary, and after a chain of events I lost $12 million of equipment. I've narrowed down over 40K lines in the faulty module to this:</p>
  
  <pre><code>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);
      }
  }
  </code></pre>
  
  <p>Some samples of the output I'm getting:</p>
  
  <pre><code>$ 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
  </code></pre>
  
  <p>Since there isn't any floating point arithmetic here, and we all know signed integers behave well on overflow in Java, I'd think there's nothing wrong with this code. However, despite the output indicating that the program didn't reach the exit condition, it reached the exit condition (it was both reached <strong>and</strong> not reached?). Why?</p>
  
  <hr>
  
  <p>I've noticed this doesn't happen in some environments. I'm on <a href="http://en.wikipedia.org/wiki/OpenJDK" rel="noreferrer">OpenJDK</a> 6 on 64-bit Linux.</p>