Java tilida 'synchronized' sinxronlash mexanizmi qanday ishlaydi?
sobes.tech AI
AIdan javob
Javaда synchronized механизмаси мониторлар (monitor object) концепциясига асосланган. Javaда ҳар бир объектга монитор боғланган.
Ҳар бир синхронлаштирилган блок ёки методга кирганда, у тегишли объектнинг мониторини эгаллашга уринади. Агар монитор бўш бўлса, у уриниш муваффақиятли бўлади ва ишлаш давом этади. Агар монитор бошқа бир иш парчаги томонидан эгалланган бўлса, ҳозирги иш парчаги блокланади ва кутиш ҳолатига ўтади, монитор эркин бўлгунча.
Ҳозирги иш парчаги синхронлаштирилган блок ёки методдан чиқганда (муваффақиятли ёки истисно чиқарган ҳолда), у мониторни эркин қилади.
Монитор ичида қуйидаги механизмлар амалга оширилган:
- Ўзаро чиқиш (Mutual Exclusion): Бир вақтда фақат бир иш парчаги объектнинг мониторини эгаллай олади. Бу, бир вақтда фақат бир иш парчаги ушбу объект учун синхронлаштирилган кодни бажара олишини таъминлайди.
- Кутиш ва эълон қилиш (Waiting and Notification): Монитор
wait(),notify()ваnotifyAll()методларини ўз ичига отади. Бу методлар мониторни эгаллаган иш парчагларига уни вақтинча эркин қилиш ва кутувчи ҳолатга ўтказиш имконини беради, кейин эса бошқа иш парчаглари уларни эълон қилиши мумкин.
Тазаликдаги амалга ошириш қуйидагича:
monitorenterинструкцияси: Синхронлаштирилган блок ёки методга киришда бажарилади. Объект мониторини эгаллашга уринади.monitorexitинструкцияси: Синхронлаштирилган блок ёки методдан чиқишда бажарилади (одатда ёки истисно билан). Объект мониторини эркин қилади.
Бу инструкциялар Java байт-кодининг бир қисми бўлиб, улар виртуал машина (JVM) томонидан ишланади. JVM мониторларни бошқариш ва иш парчагларининг блокланиши/блокдан чиқарилиши учун натив механизмлардан (mutex, semaphore) фойдаланади.
Мониторни эгаллаш объект даражасида (мисол учун, инстанс методлар ва блоклар учун) ёки класс даражасида (статик методлар ва блоклар учун) амалга оширилиши мумкин, 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() |
Барча кутувчи иш парчагларини эълон қилади. |