Пример переупорядочения инструкций Java не работает - PullRequest
0 голосов
/ 04 октября 2018

Мне нужна помощь здесь.Я пытаюсь создать пример, показывающий, что 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 Ответ

0 голосов
/ 04 октября 2018

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...