этот код ожидания / уведомления имеет ненормальную производительность - PullRequest
0 голосов
/ 05 апреля 2020

посмотрите код java ожидания / уведомления. Я думаю, не будет печатать ложь. Но когда я запускаю код, выведите false somtime. java ошибка?

public class TestThread {

    public static volatile String lock = "111";
    public static volatile AtomicBoolean flag = new AtomicBoolean(true);

    public static void main(String[] args) throws InterruptedException {

        new Thread(new Runnable() {
            public void run() {
                try {
                    while (true) {
                        synchronized (lock) {
                            flag.compareAndSet(true, false);
                            lock.wait();
                            if (!flag.get()) {
                                System.out.println(flag.get());
                            }
                        }
                    }
                } catch (InterruptedException e) {
                    e.printStackTrace();
                }
            }
        }).start();

        new Thread(new Runnable() {
            public void run() {
                while (true) {
                    synchronized (lock) {
                        flag.compareAndSet(false, true);
                        lock.notify();
                    }
                }
            }
        }).start();
    }
}

консольный результат: ложь ложь ложь

1 Ответ

0 голосов
/ 05 апреля 2020

Причина такого поведения называется ложное пробуждение .

Поток может перестать ждать и продолжить выполнение без вызова notify(). Это ложное пробуждение - механизм работы планировщика потоков системы.

Вот почему вы всегда проверяете какое-то условие перед вызовом wait() и устанавливаете его явно перед вызовом notify(). Не используйте notify() в качестве гарантии выполнения работы.

Пример:

Тема 1

synchronized (lock) {
    ...
    while (!condition) {
        lock.wait();
    }
    ...
}

Тема 2

synchronized (lock) {
    condition = true;
    lock.notify();
}
...