Sobes.tech
Middle

Wat zijn optimistische en pessimistische blokkades?

sobes.tech AI

Antwoord van AI

Optimistische en pessimistische vergrendelingen zijn benaderingen voor het beheren van gelijktijdige toegang tot gedeelde gegevens in concurrerende omgevingen (multithread-toepassingen, databases).

Pessimistische vergrendeling:

Veronderstelt dat conflicten bij toegang tot gegevens waarschijnlijk zijn. Voordat toegang tot een bron wordt verkregen, wordt deze door het thread of de transactie vergrendeld (exclusief of gedeeld). Andere threads die proberen toegang te krijgen, wachten totdat de vergrendeling wordt vrijgegeven.

  • Voordelen: Garandeert de integriteit van gegevens, is eenvoudig te implementeren bij lage concurrentie.
  • Nadelen: Kan leiden tot blokkades (wachten), de doorvoer verminderen bij hoge concurrentie (deadlocks).
  • Voorbeelden: het sleutelwoord synchronized in Java, vergrendelingen op rijniveau of tabelniveau in databases.
// Voorbeeld van pessimistische vergrendeling in Java
public class Counter {
    private int count = 0;

    public synchronized void increment() {
        count++; // Vergrendeling op het object, slechts één thread kan deze methode tegelijk uitvoeren
    }

    public synchronized int getCount() {
        return count;
    }
}

Optimistische vergrendeling:

Veronderstelt dat conflicten bij toegang tot gegevens onwaarschijnlijk zijn. Toegang tot gegevens wordt zonder vergrendelingen gedaan. Voor het opslaan van wijzigingen wordt gecontroleerd of de gegevens sindsdien niet door een andere thread zijn gewijzigd. Als dat wel het geval is, wordt de operatie geannuleerd en meestal opnieuw geprobeerd (retry).

  • Voordelen: Hoge doorvoer bij lage concurrentie, geen problemen met deadlocks.
  • Nadelen: Conflicten kunnen optreden, herhaalpogingen zijn nodig, wat de logica bemoeilijkt. Niet geschikt voor lange operaties of operaties met hoge conflictrisico's.
  • Voorbeelden: Compare-And-Swap (CAS)-bewerkingen, versiebeheer in databases (bijvoorbeeld gebruik van een versiekolom of timestamp).
// Voorbeeld van optimistische vergrendeling met CAS (java.util.concurrent.atomic)
import java.util.concurrent.atomic.AtomicInteger;

public class AtomicCounter {
    private AtomicInteger count = new AtomicInteger(0);

    public void increment() {
        // Proberen atomair te verhogen
        // Als de waarde tussen lezen en bijwerken is veranderd, wordt de poging herhaald
        count.incrementAndGet();
    }

    public int getCount() {
        return count.get();
    }
}

Vergelijking:

Kenmerk Pessimistische vergrendeling Optimistische vergrendeling
Aanname Conflicten zijn waarschijnlijk Conflicten zijn onwaarschijnlijk
Benadering Vergrendeling tot toegang Toegang zonder vergrendeling, controle bij schrijven
In omgevingen met hoge concurrentie Kan blokkades veroorzaken, doorvoer verminderen Frequent herstarten, prestaties verminderen
In omgevingen met lage concurrentie Kan overhead veroorzaken Hoge verwerkingscapaciteit
Deadlock-probleem Mogelijk Onmogelijk (vanuit het perspectief van gelijktijdige toegang tot bronnen)