Пример переупорядочения инструкций Java не работает

Мне нужно немного помощи здесь. Я пытаюсь создать пример, который показывает, что volatile необходим для защиты от переупорядочения команд.

В этом примере я пытаюсь показать, что b> a только в том случае, если происходит переупорядочение, и что volatile будет препятствовать этому.

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

Что мне здесь не хватает?

public class Example04Reorder extends Thread {
    volatile static int a = 0;
    volatile static int b = 0;
    public static void main(String[] args) throws InterruptedException {
        Example04Reorder t = new Example04Reorder();
        t.start();
        while( true )
        {
            if ( b > a ) // supposedly happens only on reordering
            {
                System.out.println("b was bigger than a");
                System.exit(1);
            }
        }
    }
    public void run() {
        while (true) 
        {
            a = 5;
            b = 4;
            b = 0;
            a = 0;
        }
    }
 }

1 ответ

Решение

Здесь нет проблем. У вас есть две операции чтения в вашем операторе сравнения. И поскольку между присваиваниями во втором потоке нет задержки, они выполняются на мгновение. Таким образом, возможно, что первый поток получил значение 4 для b, а когда в значении чтения для a он уже был установлен на 0. Так вот почему вы получаете свои результаты.

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