Sobes.tech
Middle

Mi az optimista és pesszimista zárolás?

sobes.tech MI

Válasz az MI-től

Optimista és pesszimista zárolások a párhuzamos hozzáférés kezelésére szolgáló megközelítések a közös adatokhoz versengő környezetekben (többszálú alkalmazások, adatbázisok).

Pesszimista zárolás:

Feltételezi, hogy az adatokhoz való hozzáférés során valószínűek a konfliktusok. Mielőtt hozzáférést kapna egy erőforráshoz, a szál vagy tranzakció zárolja azt (kizáró vagy megosztott zárolás). Más szálak, amelyek hozzáférést próbálnak szerezni, várni fognak, amíg a zárolás fel nem oldódik.

  • Előnyök: Biztosítja az adatok integritását, egyszerű a megvalósítás alacsony verseny esetén.
  • Hátrányok: Akadályokat (deadlockokat) okozhat, csökkentheti a keresztmetszetet magas verseny esetén.
  • Példák: a synchronized kulcsszó Java-ban, zárolások sor- vagy táblaszinten adatbázisokban.
// Pesszimista zárolás példája Java-ban
public class Counter {
    private int count = 0;

    public synchronized void increment() {
        count++; // Zárolás az objektumon, csak egy szál hajthatja végre ezt a metódust egyszerre
    }

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

Optimista zárolás:

Feltételezi, hogy az adatokhoz való hozzáférés során kisebb valószínűséggel fordulnak elő konfliktusok. Az adatokhoz való hozzáférés zárolás nélkül történik. A változtatások mentése előtt ellenőrzi, hogy az adatok nem változtak-e más szál által a olvasás óta. Ha változtak, a művelet megszakad és általában újra próbálkozik (retry).

  • Előnyök: Magas keresztmetszet alacsony verseny esetén, nincs deadlock probléma.
  • Hátrányok: Konfliktusok fordulhatnak elő, amelyek újrapróbálkozásokat igényelnek, bonyolítva a logikát. Nem alkalmas hosszú műveletekre vagy magas konfliktus valószínűség esetén.
  • Példák: Compare-And-Swap (CAS) műveletek, verziókezelés (versioning) adatbázisokban (pl. verzió vagy időbélyeg oszlop használata).
// Optimista zárolás CAS használatával (java.util.concurrent.atomic)
import java.util.concurrent.atomic.AtomicInteger;

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

    public void increment() {
        // Atomi növelés próbálkozása
        // Ha az érték megváltozott az olvasás és a frissítés között, a művelet újra próbálkozik
        count.incrementAndGet();
    }

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

Összehasonlítás:

Jellemző Pesszimista zárolás Optimista zárolás
Feltételezés Konfliktusok valószínűek Konfliktusok valószínűtlenek
Megközelítés Zárolás a hozzáférésig Hozzáférés zárolás nélkül, ellenőrzés íráskor
Magas konfliktus sebességnél Akadályokat okozhat, csökkentheti a keresztmetszetet Gyakori újraindítások, csökkentett teljesítmény
Alacsony konfliktus sebességnél Kiegészítő költségeket okozhat Magas keresztmetszetet biztosít
Deadlock probléma Lehetséges Nem lehetséges (a versengő hozzáférés szempontjából)