Kako funkcioniše mehanizam sinhronizacije 'synchronized' u Javi u pozadini?
sobes.tech АИ
Одговор од АИ
Механизам synchronized у Јави се заснива на концепту монитора (monitor objects). Сваком објекту у Јави је асоциран монитор.
Када нит уђе у синхронизовани блок или метод, она покушава да освоји одговарајући монитор објекта. Ако је монитор слободан, нит га осваја и наставља са извршавањем. Ако је монитор заузет од стране друге нити, тренутна нит се блокира и прелази у стање чекања, док монитор не буде ослобођен.
Када нит напусти синхронизовани блок или метод (успешно или изузетком), она ослобађа монитор.
Унутар монитора су реализовани:
- Међусобно искључивање (Mutual Exclusion): Само једна нит може поседовати монитор објекта у једном тренутку. Ово гарантује да само једна нит може извршавати синхронизовани код за тај објекат.
- Чекање и обавештење (Waiting and Notification): Монитор укључује скуп везаних метода
wait(),notify()иnotifyAll(). Ове методе омогућавају нитима, које поседују монитор, да привремено ослободе монитор и прелазе у стање чекања, а затим буду обавештени од других нитова о могућности да наставе рад.
Реализација у позадини укључује:
monitorenterинструкција: Извршава се при уласку у синхронизовани блок или метод. Покушава да освоји монитор објекта.monitorexitинструкција: Извршава се при изласку из синхронизованог блока или метода (као у случају нормалног завршетка, тако и при изузетку). Ослобађа монитор објекта.
Ове инструкције су део байт-кода Јаве и обрађују се од стране виртуелне машине Јаве (JVM). JVM користи нативне механизме оперативног система (на пример, mutexes, semaphores) за управљање монитора и блокирање/одблокирање нитова.
Освајање монитора може бити реализовано на нивоу објекта (за instance methods и блокове) или на нивоу класе (за static methods и блокове), користећи објекат 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() |
Обавештава све чекајуће нитове. |