Sobes.tech
Middle+

Hoe werkt het 'synchronized' synchronisatie-mechanisme in Java onder de motorkap?

sobes.tech AI

Antwoord van AI

Het synchronized-mechanisme in Java is gebaseerd op het concept van monitoren (monitor objecten). Elk object in Java is geassocieerd met een monitor.

Wanneer een thread een gesynchroniseerde blok of methode binnenkomt, probeert hij de monitor van het overeenkomstige object te verkrijgen. Als de monitor vrij is, krijgt de thread deze en gaat verder met uitvoeren. Als de monitor door een andere thread wordt bezet, wordt de huidige thread geblokkeerd en gaat hij in een wachttoestand totdat de monitor wordt vrijgegeven.

Wanneer een thread een gesynchroniseerde blok of methode verlaat (of succesvol voltooit of een uitzondering werpt), geeft hij de monitor vrij.

Binnen de monitor worden geïmplementeerd:

  1. Wederzijdse uitsluiting (Mutual Exclusion): Slechts één thread kan op elk moment de monitor van een object bezitten. Dit garandeert dat slechts één thread gesynchroniseerde code voor dat object kan uitvoeren.
  2. Wachten en notificatie (Waiting and Notification): De monitor bevat een set gerelateerde methoden wait(), notify() en notifyAll(). Deze methoden stellen threads die de monitor bezitten in staat om deze tijdelijk vrij te geven en in een wachttoestand te gaan, en vervolgens door andere threads te worden geïnformeerd over de mogelijkheid om door te gaan.

De onderliggende implementatie omvat:

  • monitorenter instructie: Wordt uitgevoerd bij het betreden van een gesynchroniseerde blok of methode. Probeert de monitor van het object te verkrijgen.
  • monitorexit instructie: Wordt uitgevoerd bij het verlaten van een gesynchroniseerde blok of methode (zowel bij normale beëindiging als bij uitzondering). Geeft de monitor van het object vrij.

Deze instructies maken deel uit van de Java bytecode en worden afgehandeld door de Java Virtual Machine (JVM). De JVM gebruikt native mechanismen van het besturingssysteem (zoals mutexen, semaforen) om monitors en het blokkeren/deblokkeren van threads te beheren.

Het verkrijgen van de monitor kan op objectniveau worden geïmplementeerd (voor instance methods en blocks) of op klasseniveau (voor static methods en blocks), met behulp van het Class-object als lock.

Voorbeeld van gebruik:

public class Counter {
    private int count = 0;

    public synchronized void increment() { // Gesynchroniseerde methode
        count++;
    }

    public void decrement() {
        synchronized (this) { // Gesynchroniseerde blok
            count--;
        }
    }

    public static synchronized void staticMethod() { // Statische gesynchroniseerde methode
        // ...
    }
}

Tabel van methoden van de Object-klasse gerelateerd aan monitors:

Methode Beschrijving
wait() De thread die de monitor bezit, geeft deze tijdelijk vrij en gaat in wachttoestand.
notify() Informeert een van de wachtende threads dat hij de monitor kan proberen te verkrijgen en door te gaan.
notifyAll() Informeert alle wachtende threads.