Странное поведение в параллелизме Java без синхронизации - PullRequest
4 голосов
/ 22 января 2012

В Java Concurrency на практике есть пример, который запутал меня:

public class Novisibility {
    private static boolean ready;
    private static int number;

    private static class ReaderThread implements Runnable {

        public void run() {
            while (!ready) {
                Thread.yield();
            }
            System.out.println(number);
        }
    }

    public static void main(String[] args) {
        System.out.println("0");
        new Thread(new ReaderThread()).run();
        System.out.println("1");
        number = 42;
        System.out.println("2");
        ready = true;
        System.out.println("3");
    }
}

Я могу понять, что переупорядочение делает цикл никогда не прерываться, но я не могу понять, почему«1», «2» и «3» никогда не выводятся на консоль.Может ли какое-нибудь тело помочь?

1 Ответ

7 голосов
/ 22 января 2012

Вы не создаете новую ветку, а запускаете ее в текущей.Вместо этого используйте метод start().

Поскольку вы run() выполняете в основном потоке, и этот метод выполняется в бесконечном цикле, вы никогда не достигнете операторов System.out.println() (и при этом вы не достигнете ready = true;).* Из JavaDoc на run():

Если этот поток был создан с использованием отдельного объекта Runnable, тогда вызывается метод run этого объекта Runnable;в противном случае этот метод ничего не делает и возвращает.

И start():

Заставляет этот поток начать выполнение;виртуальная машина Java вызывает метод run этого потока.

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