Полный пример использования летучего ключевого слова в Java?

Мне нужен простой пример использования volatile ключевое слово в Java, ведет себя непоследовательно в результате неиспользования volatile,

Теоретическая часть изменчивого использования мне уже ясна.

1 ответ

Прежде всего, нет гарантированного способа разоблачения кэширования из-за энергонезависимых переменных. Ваша JVM может быть очень любезна с вами все время и эффективно рассматривать каждую переменную как изменчивую.

При этом существует несколько способов увеличить вероятность того, что потоки будут кэшировать свои собственные версии энергонезависимой переменной. Вот программа, которая демонстрирует важность энергозависимости на большинстве машин, на которых я ее тестировал (адаптированная версия здесь):

class Test extends Thread {

    boolean keepRunning = true;

    public void run() {
        while (keepRunning) {
        }

        System.out.println("Thread terminated.");
    }

    public static void main(String[] args) throws InterruptedException {
        Test t = new Test();
        t.start();
        Thread.sleep(1000);
        t.keepRunning = false;
        System.out.println("keepRunning set to false.");
    }
}

Эта программа обычно просто выводит

keepRunning set to false.

и продолжай бежать. Изготовление keepRunning изменчивый заставляет это печатать

keepRunning set to false.
Thread terminated.

и прекратить.

Другие вопросы по тегам