Sobes.tech
Middle+

Kako funkcioniše mehanizam sinhronizacije 'synchronized' u Javi u pozadini?

sobes.tech АИ

Одговор од АИ

Механизам synchronized у Јави се заснива на концепту монитора (monitor objects). Сваком објекту у Јави је асоциран монитор.

Када нит уђе у синхронизовани блок или метод, она покушава да освоји одговарајући монитор објекта. Ако је монитор слободан, нит га осваја и наставља са извршавањем. Ако је монитор заузет од стране друге нити, тренутна нит се блокира и прелази у стање чекања, док монитор не буде ослобођен.

Када нит напусти синхронизовани блок или метод (успешно или изузетком), она ослобађа монитор.

Унутар монитора су реализовани:

  1. Међусобно искључивање (Mutual Exclusion): Само једна нит може поседовати монитор објекта у једном тренутку. Ово гарантује да само једна нит може извршавати синхронизовани код за тај објекат.
  2. Чекање и обавештење (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() Обавештава све чекајуће нитове.