Java тилиндеги 'synchronized' синхрондоштуруу механизми кандай иштейт?
sobes.tech AI
AIден жооп
Javaда synchronized механизми мониторлордун (monitor objects) концепциясына негизделген. Javaда ар бир объект менен монитор байланышкан.
Токтомуу блокко же методго киргенде, жип тиешелүү объекттин мониторун алуу аракетин жасайт. Эгер монитор бош болсо, ал аны алат жана иштөөдө калат. Эгер монитор башка жип тарабынан ээленсе, учурдагы жип тоскоолдукка учурап, күтүү абалына өтөт, монитор бошотулгуча.
Жип синхрондоштурулган блоктон же методтон чыгуу менен (жакшы же ката менен), ал мониторду бошотот.
Монитордун ичинде төмөнкү функциялар ишке ашырылат:
- Өз ара тыгыздык (Mutual Exclusion): Бир мезгилде бир гана жип объекттин мониторун ээ боло алат. Бул, бир гана жип белгилүү бир объект үчүн синхрондоштурулган кодду аткара алат дегенди билдирет.
- Күтүү жана кабарлоо (Waiting and Notification): Монитор
wait(),notify()жанаnotifyAll()методдорун камтыйт. Бул методдор мониторду ээ болгон жиптерге аны убактылуу бошотуп, күтүү абалына өтүүгө жана башка жиптер тарабынан кабардар кылынууга мүмкүндүк берет.
Ички ишке ашыруу төмөнкүлөрдү камтыйт:
monitorenterкөрсөтмөсү: Синхрондоштурулган блокко же методго кирүүдө аткарылат. Объекттин мониторун алуу аракетин жасайт.monitorexitкөрсөтмөсү: Чыгуу учурда аткарылат. Объекттин мониторун бошотот.
Бул көрсөтмөлөр Java байткодунун бөлүгү болуп, JVM тарабынан иштетилет. JVM натыйжалуу системалык механизмдерди (мисалы, mutex, semaphore) колдонуп, мониторлорду жана жиптердин блоктолушу/блоктон чыгарылышын башкарет.
Мониторду алуу объекттин деңгээлинде (мисалы, instance методдор жана блокдор үчүн) же класс деңгээлинде (мисалы, static методдор жана блокдор үчүн) ишке ашырылышы мүмкүн, Class объектисин блокировка катары колдонуп.
Келтирилген мисал:
public class Counter {
private int count = 0;
public synchronized void increment() { // Синхрондоштурулган метод
count++;
}
public void decrement() {
synchronized (this) { // Синхрондоштурулган блок
count--;
}
}
public static synchronized void staticMethod() { // Синхрондоштурулган статикалык метод
// ...
}
}
Object классынын мониторлор менен байланышкан методдор таблицасы:
| Метод | Түшүндүрмө |
|---|---|
wait() |
Мониторду ээ болгон жип аны убактылуу бошотуп, күтүү абалына өтөт. |
notify() |
Күтүп жаткан бир жипке кабар берет, ал мониторду алууга аракет кылып, ишин уланта алат. |
notifyAll() |
Бардык күтүп жаткан жиптерге кабар берет. |