увеличить / уменьшить переменную с помощью notify / notifyAll - PullRequest
2 голосов
/ 11 мая 2019

Предположим, у меня есть 2 темы.

Каждый поток выполняется 100 раз.

  • Поток 1 уменьшает переменную на 10.

  • Поток 2 увеличивает переменную на 10.

В чем разница между использованием notify () или notifyAll () в методе увеличения (...)?

class Monitor1 {
private volatile int compar;

public Monitor1(int val) {
    compar = val;
}

synchronized public void decrease(int amount) {
    while (amount > compar) {
        try {
            wait();
        } catch (InterruptedException e) {
            e.printStackTrace();
        }
    }
    compar -= amount;
    System.out.println("variable=" + compar);
}

synchronized public void increase(int amount) {
    compar += amount;
    notifyAll();
    System.out.println("variable=" + compar);
}
}

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

1 Ответ

0 голосов
/ 12 мая 2019

notify () пробуждает только один ожидающий поток, а notifyAll () пробуждает все. Эта программа всегда должна использовать notifyAll (). В противном случае может возникнуть ситуация, когда у монитора достаточно токенов, но метод уменьшает () не возвращает:

Monitor1 monitor = new Monitor1(0);
Thread c1 = new Thread(()->monitor.decrease(1));
Thread c2 = new Thread(()->monitor.decrease(1));
c1.start(); c2.start();
Thread.sleep(100);
monitor.increase(2);

Если используется notify (), только один потребитель продолжит выполнение (что неверно), а при использовании notifyAll () оба потребителя продолжат (что правильно).

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