Почему эта простая многопоточная программа застревает?

Взгляните на эту простую Java-программу:

import java.lang.*;

class A {
    static boolean done;
    public static void main(String args[]) {
        done = false;
        new Thread() {
            public void run() {
            try {
                Thread.sleep(1000); // dummy work load
            } catch (Exception e) {
                done = true;
            }
            done = true;
            }
        }.start();
        while (!done);
        System.out.println("bye");
    }
}

На одной машине он печатает "пока" и сразу же выходит, а на другой машине ничего не печатает и сидит там вечно. Зачем?

2 ответа

Решение

Это потому что ваш boolean не является volatile, следовательно ThreadРазрешается кэшировать его копии и никогда не обновлять их. Я бы порекомендовал AtomicBoolean - это предотвратит любые проблемы, которые могут у вас возникнуть.

public static void main(String args[]) {
    final AtomicBoolean done = new AtomicBoolean(false);
    new Thread() {
        public void run() {
            done.set(true);
        }
    }.start();
    while (!done.get());
    System.out.println("bye");
}

Ко времени достижения цикла while основной программы (который также является потоком) новый поток может завершить свой запуск (), где для флага завершения установлено значение true. Просто чтобы подтвердить это, вы можете добавить спящий режим в run(), прежде чем для параметра done задано значение true, а затем посмотреть, отображается ли ваше сообщение на другом компьютере. Надеюсь, это поможет.

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