Я изучал параллелизм в Java и столкнулся с проблемой производителя-потребителя. Это очевидно стандартно, и я видел почти идентичный ответ во многих местах.
public synchronized void put(int num){
while (!empty) {
try{
wait(); }
catch {}
}
buffer=num;
empty=false;
notify();
}
public synchronized int take(){
while (empty) {
try{
wait(); }
catch {}
}
empty=true;
notify();
return buffer;
}
Насколько я понимаю, синхронизированный объект использует блокировку на уровне объекта, а это означает, что потоки не могут быть ни помещены, ни помещены, ни взяты. Но оба метода ждут другого метода. Вот где я запутался: кажется, это создает тупик. Если поток А перейдет в пут while empty=false
, он будет ждать. Тем не менее, поток B не может ввести take, потому что он синхронизирован. Поэтому пустое навсегда останется ложным, что приведет к тупику.
Учитывая, сколько раз я в основном видел этот ответ, однако, похоже, что он должен быть правильным. Что я не так понимаю?
Спасибо!