Kaip veikia 'synchronized' sinchronizacijos mechanizmas Java kalboje užkulisiuose?
sobes.tech AI
Atsakymas iš AI
„Synchronized“ mechanizmas Java pagrįstas monitorių (monitor objects) koncepcija. Kiekvienas Java objektas yra susijęs su monitoriumi.
Kai srautas įeina į sinchronizuotą bloką arba metodą, jis bando įgyti atitinkamą objekto monitorių. Jei monitorius laisvas, jis jį įgyja ir tęsia vykdymą. Jei monitorius užimtas kitu srautu, dabartinis srautas užblokuojamas ir pereina į laukimo būseną, kol monitorius nebus atlaisvintas.
Kai srautas palieka sinchronizuotą bloką arba metodą (sėkmingai arba išmetęs išimtį), jis atlaisvina monitorių.
Monitoriaus viduje įgyvendinti:
- Vienalaikė išimtis (Mutual Exclusion): Tik vienas srautas gali turėti objekto monitorių vienu metu. Tai užtikrina, kad tik vienas srautas gali vykdyti sinchronizuotą kodą šiam objektui.
- Laukimas ir pranešimas (Waiting and Notification): Monitorius apima
wait(),notify()irnotifyAll()metodų rinkinį. Šie metodai leidžia srautams, turintiems monitorių, laikinai jį atlaisvinti ir pereiti į laukimo būseną, o vėliau būti praneštiems kitų srautų, kad jie galėtų tęsti darbą.
Vidinė įgyvendinimas apima:
monitorenterinstrukcija: Vykdoma įeinant į sinchronizuotą bloką arba metodą. Ji bando įgyti objekto monitorių.monitorexitinstrukcija: Vykdoma išeinant iš sinchronizuoto bloko arba metodo (normalaus užbaigimo arba išimties atveju). Ji atlaisvina objekto monitorių.
Šios instrukcijos yra Java baitkodo dalis ir apdorojamos Java virtualios mašinos (JVM). JVM naudoja natūralius operacinės sistemos mechanizmus (pvz., mutexes, semaforus) monitorių valdymui ir srautų blokavimui/atblokavimui.
Monitoriaus įgijimas gali būti įgyvendintas objekto lygyje (pavyzdžiui, instance metodų ir blokų) arba klasės lygyje (pavyzdžiui, static metodų ir blokų), naudojant Class objektą kaip užraktą.
Pavyzdys naudojimui:
public class Counter {
private int count = 0;
public synchronized void increment() { // Sinchronizuotas metodas
count++;
}
public void decrement() {
synchronized (this) { // Sinchronizuotas blokas
count--;
}
}
public static synchronized void staticMethod() { // Sinchronizuotas statinis metodas
// ...
}
}
Object klasės metodų, susijusių su monitoriais, lentelė:
| Metodas | Aprašymas |
|---|---|
wait() |
Srautas, turintis monitorių, laikinai jį atlaisvina ir pereina į laukimo būseną. |
notify() |
Praneša vienam laukiančiam srautui, kad jis gali bandyti įgyti monitorių ir tęsti darbą. |
notifyAll() |
Praneša visiems laukiančiam srautams. |