Как определить частоту выполнения 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%.
Как можно объяснить эту статистику?