Kā darbojas 'synchronized' sinhronizācijas mehānisms Java valodā fonā?
sobes.tech AI
Atbilde no AI
Synchronized mehānisms Java ir balstīts uz monitoru (monitor objects) koncepciju. Katrs Java objekts ir saistīts ar monitoru.
Kad pavedienu ieiet sinhronizētā blokā vai metodē, tas mēģina iegūt atbilstošo objekta monitoru. Ja monitors ir brīvs, tas to iegūst un turpina izpildi. Ja monitors ir aizņemts ar citu pavedienu, pašreizējais pavediens tiek bloķēts un pāriet uz gaidīšanas stāvokli, līdz monitors tiek atbrīvots.
Kad pavediens atstāj sinhronizēto bloku vai metodi (veiksmīgi vai ar izņēmumu), tas atbrīvo monitoru.
Monitorā iekšpusē ir īstenotas:
- Savstarpēja izslēgšana (Mutual Exclusion): Tikai viens pavediens var būt objekta monitorā vienlaikus. Tas nodrošina, ka tikai viens pavediens var izpildīt sinhronizēto kodu šim objektam.
- Gaidīšana un paziņošana (Waiting and Notification): Monitorā ir
wait(),notify()unnotifyAll()metožu kopums. Šīs metodes ļauj pavedieniem, kuriem ir monitors, pagaidu to atbrīvot un pāriet gaidīšanas stāvoklī, kā arī saņemt paziņojumus no citiem pavedieniem par iespēju turpināt darbu.
Iekšējā īstenošana ietver:
monitorenterinstrukcija: Tiek izpildīta, ieejot sinhronizētā blokā vai metodē. Tā mēģina iegūt objekta monitoru.monitorexitinstrukcija: Tiek izpildīta, iznākot no sinhronizētā bloka vai metodes (gan normālas pabeigšanas, gan ar izņēmumu). Tā atbrīvo objekta monitoru.
Šīs instrukcijas ir Java baitkoda daļa un tiek apstrādātas ar Java virtuālo mašīnu (JVM). JVM izmanto nativus operētājsistēmas mehānismus (piemēram, mutexes, semaforus) monitoru pārvaldībai un pavedienu bloķēšanai/atbloķēšanai.
Monitoru iegūšana var tikt īstenota objekta līmenī (piemēram, instance metožu un bloku gadījumā) vai klases līmenī (piemēram, static metožu un bloku gadījumā), izmantojot Class objektu kā bloķi.
Piemērs lietošanai:
public class Counter {
private int count = 0;
public synchronized void increment() { // Sinhronizēta metode
count++;
}
public void decrement() {
synchronized (this) { // Sinhronizēts bloks
count--;
}
}
public static synchronized void staticMethod() { // Sinhronizēta statiska metode
// ...
}
}
Object klases metožu tabula, kas saistīta ar monitoriem:
| Metode | Apraksts |
|---|---|
wait() |
Pavediens, kas ir monitorā, to īslaicīgi atbrīvo un pāriet gaidīšanas stāvoklī. |
notify() |
Uzzina vienu no gaidošajiem pavedieniem, ka tas var mēģināt iegūt monitoru un turpināt darbu. |
notifyAll() |
Uzzina visus gaidošos pavedienus. |