Смотрел сейчас видео Алишева и решил у себя протестировать данный код из его примера.
public class Test1 {
    public static void main(String[] args) {
        MyThread myThread = new MyThread();
        myThread.start();

        Scanner scanner = new Scanner(System.in);
        scanner.nextLine();
        myThread.shutdown();

    }
}

class MyThread extends Thread {
    private volatile boolean running = true;
    @Override
    public void run() {
        while (running) {
            System.out.println("Hello");
            try {
                Thread.sleep(100);
            } catch (InterruptedException e) {
                e.printStackTrace();
            }
        }
    }

    public void shutdown() {
        this.running = false;
    }
}
Сначала не ставил volatile на переменную running. Позапускал несколько раз. Были такие выводы в консоль. Я нажимал enter и вывод все равно продолжался. По второму нажатию прекращался. Потом поставил volatile. Казалось бы, volatile должен исправить данную проблему. Но ничего не изменилось, все равно бывают проскоки. Почему так? Я что-то не совсем понимаю как работает данное ключевое слово.