JavaRush /Java блог /Архив info.javarush /Могут ли возникнуть дедлоки при использовании методов wai...
yabursev
11 уровень
Санкт-Петербург

Могут ли возникнуть дедлоки при использовании методов wait-notify?

Статья из группы Архив info.javarush
Добрый времени суток, друзья! И так на 27-ом уровне есть вопрос, который указан в заголовке данного топика. Если честно, я не смог сам ответить на данный вопрос, и в интернете поискал, но не нашел ответа (может быть плохо искал). Помогите пожалуйста разобраться с данным вопросом. Или дайте ссылку, где можно найти ответ на данный вопрос. Всем заранее спасибо!
Комментарии (5)
ЧТОБЫ ПОСМОТРЕТЬ ВСЕ КОММЕНТАРИИ ИЛИ ОСТАВИТЬ КОММЕНТАРИЙ,
ПЕРЕЙДИТЕ В ПОЛНУЮ ВЕРСИЮ
Soros Уровень 39
4 марта 2020
Думаю, что правильный ответ: "Грамотное использование методов wait-notify позволяет снизить риск возникновения дедлоков." Простой ответ - да, могут
4 июля 2019
На вики есть задача об обедающих философах. Написано просто и понятно. Пять философов сидят за круглым столом У каждого по тарелке со спагетти Между ними вилки. Для того чтобы поесть нужно 2 вилки Философ может размышлять пока не появится нужная вилка либо есть. Представим следующее. Каждый философ - это нить Вилки общий ресурс. wite() философ ждет вилку notify() философ кладет вилку Теперь алгоритм Если левая вилка занята леваяВилка.wite() Берет левую вилку Если правая вилка занята праваяВилка.wite() Философ ест (Thread.sleep(***)) леваяВилка.notify() праваяВилка.notify() То есть если все философы одновременно захватят по левой вилке получим deadlock
Pryanichkin Уровень 41
10 августа 2016
Мне кажется, ответ — да. Попробуй вот этот код, источник- Тыц
public class Test {
    public static void main(String[] args) throws InterruptedException {
        PrintChar a = new PrintChar('a');
        PrintChar b = new PrintChar('b');
        Thread ta = new Thread(a);
        Thread tb = new Thread(b);
        ta.start();
        tb.start();
    }
}
class PrintChar implements Runnable {
    final Object o = new Object();
    char ch;
    public PrintChar(char a) {
        ch = a;
    }

    @Override
    public void run() {
        for (int i = 0; i < 100; i++) {
            synchronized (o) {
                System.out.print(ch);
                try {
                    o.wait();
                    o.notifyAll();
                } catch (InterruptedException ex) {
                }
            }
        }
    } 
}