Kuidas töötab 'synchronized' sünkroniseerimismehhanism Java keeles taustal?
sobes.tech AI
Vastus AI-lt
Synchronized mehhanism Java-s põhineb monitoride (monitor objects) kontseptsioonil. Igal Java objektil on seotud monitor.
Kui lõng siseneb sünkroniseeritud plokki või meetodisse, ta püüab haarata vastava objekti monitori. Kui monitor on vaba, ta haarab selle ja jätkab täitmist. Kui monitor on hõivatud teise lõnga poolt, siis praegune lõng blokeeritakse ja läheb ootamise olekusse, kuni monitor vabastatakse.
Kui lõng lahkub sünkroniseeritud plokist või meetodist (õnnestunult või erandi tõttu), siis ta vabastab monitori.
Monitori sees on rakendatud:
- Võrdne välistus (Mutual Exclusion): Ainult üks lõng võib samaaegselt omada objekti monitori. See tagab, et ainult üks lõng saab täita sünkroniseeritud koodi selle objekti jaoks.
- Ootamine ja teavitamine (Waiting and Notification): Monitor sisaldab komplekti meetodeid
wait(),notify()janotifyAll(). Need meetodid võimaldavad lõngadel, kellel on monitor, ajutiselt selle vabastada ja minna ootamise olekusse ning seejärel teavitada teisi lõngu võimalusest jätkata tööd.
Sisemine teostus hõlmab:
monitorenterkäsk: Täidetakse sisenemisel sünkroniseeritud plokki või meetodisse. Püüab haarata objekti monitori.monitorexitkäsk: Täidetakse väljudes sünkroniseeritud plokist või meetodist (nii normaalse lõpetamise kui erandi korral). Vabastab objekti monitori.
Need käsud on osa Java baitkoodist ja neid töötleb Java virtuaalmasin (JVM). JVM kasutab natiivseid operatsioonisüsteemi mehhanisme (näiteks mutexid, semaforid) monitoride haldamiseks ja lõngade blokeerimiseks/avatamiseks.
Monitori haaramine võib olla teostatav objekti tasandil (näiteks, instance meetodite ja plokkide puhul) või klassi tasandil (näiteks, static meetodite ja plokkide puhul), kasutades Class objekti kui lukku.
Näide kasutamiseks:
public class Counter {
private int count = 0;
public synchronized void increment() { // Sünkroniseeritud meetod
count++;
}
public void decrement() {
synchronized (this) { // Sünkroniseeritud plokk
count--;
}
}
public static synchronized void staticMethod() { // Sünkroniseeritud statiline meetod
// ...
}
}
Object klassi meetodite tabel, mis on seotud monitoridega:
| Meetod | Kirjeldus |
|---|---|
wait() |
Lõng, kellel on monitor, vabastab selle ajutiselt ja läheb ootamise olekusse. |
notify() |
Teavitab üht ootavat lõnga, et ta võib proovida haarata monitori ja jätkata tööd. |
notifyAll() |
Teavitab kõiki ootavaid lõngu. |