Итак, я протестировал этот код на java 8, 11 и 14, все они имеют одинаковый результат. Это плохая практика и нереалистичный сценарий, но я хотел бы понять внутренности JVM, из-за которых это происходит.
Если вы запустите этот код, вы заметите, что все, кроме самой части печати system.out.println внутри, выполняется. В какой-то момент с немного другой версией Java мне удалось распечатать ее, изменив игру слишком изменчиво, но даже это сейчас не работает.
Пожалуйста, хотя бы проверьте код, прежде чем утверждать, что он просто блокирует переменные или использует кеш, это не так, если выполняется, и все внутри него работает, кроме самой части печати.
public class Main {
public static void main(String[] args) {
TestClass t = new TestClass();
System.out.println("Starting test");
new MyRunnable(t).start();
while (true)
t.testUpdate(System.currentTimeMillis());
}
}
public class MyRunnable extends Thread {
private TestClass t;
public MyRunnable(TestClass t) {
this.t = t;
}
@Override
public void run() {
try {
Thread.sleep(500L);
t.setPlay(true);
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}
public class TestClass {
private boolean play = false;
private long lastUpdate = 0;
private long updateRate = 2000;
private boolean hasSysoBeenHit = false;
public void testUpdate(long callTime) {
System.out.println(play);
System.out.println((callTime-lastUpdate));
if (this.play && ((callTime-lastUpdate) >= updateRate)) {
System.out.println("Updating! " + (hasSysoBeenHit = true));
this.lastUpdate = callTime;
}
System.out.println("hasbeenhit? " + hasSysoBeenHit);
}
public void setPlay(boolean t) {
System.out.println("Starting game...");
this.play = t;
}
}
play
должен бытьvolatile
- person areus   schedule 19.01.2021