Как определить частоту выполнения reordering'a?

Есть следующий код:

class Shared {
   int x;
   int y;

   void increment() {
      x++;
      y++;
   }

   void check() {
      if (x < y) {
         System.out.println("Ooops! x < y");
      }
   }
}

И вот, я создаю два потока - один читатель, другой писатель.

Shared shared = new Shared();

Thread writer = new Thread(() -> {
   for (int i = 0; i < N; i++) {
       shared.increment();
   }
});

Thread reader = new Thread(() -> {
   for (int i = 0; i < N; i++) {
       shared.check();
   }
});

writer.start();
reader.start();

Как можно понять, операции внутри increment() могут быть переставлены местами, чтобы JIT мог оптимизировать время выполнения программы.

И вот тут уже начинаются весёлые вещи. Запуская этот код на своей машине (MackBook Pro mid 2019), я столкнулся с такой зависимостью:

1) Если N < 1000 - вероятность того что операции x++ и y++ будут переставлены практически равна нулю.

2) Если N > 1000 - вероятность того что операции x++ и y++ будут переставлены уже начинает приближаться к 100%.

Как можно объяснить эту статистику?


Ответы (0 шт):