I have simple program that runs background thread:
private static boolean isRunning = true;
public static void main(String[] args) throws InterruptedException {
    Thread bgThread = new Thread(() -> {
        int i = 0;
        while (isRunning) {
            i++;
        }
    });
    bgThread.start();
    TimeUnit.SECONDS.sleep(1);
    isRunning = false;
}
Due to no synchronization on isRunning variable, this program never ends on my computer. Background thread goes forever. That is understandable, but when i add System.out.println(i) instruction inside Runnable task, it stops after 1 second!
Thread bgThread = new Thread(() -> {
    int i = 0;
    while (isRunning) {
        i++;
        System.out.println(i);
    }
});
Why does this instruction causes background thread to notice update of isRunning variable? I would appreciate explanation to this one :)
