Пример переупорядочения инструкций 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. Так вот почему вы получаете свои результаты.