Sobes.tech
Middle
253

Javaда notify() жана notifyAll() методдорунын айырмасы эмнеде?

AIден жооп

sobes.tech AI

Айырмасы — notify() гана бир, кездейсоқ тандалган, жипти объекттин мониторунда күтүп жаткан топтомодон ойготот, ал эми notifyAll() ошол монитордо күтүп жаткан бардык жиптерди ойготот.

  • notify(): Эгер сиз ишенсеңиз, анда бир гана күтүп жаткан жип пайдалуу ишти аткара алат деп, колдонулат. Бул натыйжалуу болушу мүмкүн, анткени башка жиптерди керексиз ойготуудан жана контекст алмашуудан сактайт.

  • notifyAll(): Эгер сиз билбесеңиз, кайсы жип билдирүүнү алууга тийиш экенин, же бир нече жип билдирүүдөн пайдалана алат деп, колдонулат. Мисалы, ресурстардын пулдары менен иштөөдө же өндүрүүчү-колдонуучу моделдеринде, бир нече колдонуучу жаңы элементти иштетүүгө даяр болушу мүмкүн.

Ойгонгондон кийин, жиптер кайра мониторду алуу үчүн атаандашат. Жай гана ал мониторду ийгиликтүү алса, ал уланта алат. Башка ойгонгон жиптер кайра күтүүгө өтөт, алардын мониторду кайра алгандан кийин гана.

class SharedResource {
    private boolean conditionMet = false;

    public synchronized void waitForCondition() throws InterruptedException {
        while (!conditionMet) { // while цикл колдонулат, if эмес, "жалған" ойготууларды коргоо үчүн
            wait(); // Жип мониторду бошотуп, күтүү абалына өтөт
        }
        // Шарт аткарылды, жип уланта алат
    }

    public synchronized void fulfillCondition() {
        conditionMet = true;
        // notify();      // Кездейсоқ жипти ойготот
        notifyAll(); // Бардык күтүп жаткан жиптерди ойготот
    }
}