Sobes.tech
Middle

Co jsou to optimistické a pesimistické zámky?

sobes.tech AI

Odpověď od AI

Optimistické a pesimistické zámky sú prístupy k riadeniu paralelného prístupu k spoločným dátam v konkurenčných prostrediach (viacvláknové aplikácie, databázy).

Pesimistická zámka:

Predpokladá, že konflikty pri prístupe k dátam sú pravdepodobné. Pred získaním prístupu ku zdroju si vlákno alebo transakcia naň ukladá zámok (exkluzívny alebo zdieľaný). Iné vlákna, ktoré sa snažia získať prístup, budú čakať, kým sa zámok neodstráni.

  • Výhody: Zabezpečuje integritu dát, je jednoduchá na implementáciu pri nízkej konkurencii.
  • Nevýhody: Môže viesť k blokádam (deadlockom), zníženiu priepustnosti pri vysokej konkurencii.
  • Príklady: kľúčové slovo synchronized v Jave, zámky na úrovni riadku alebo tabuľky v databázach.
// Príklad pesimistickej zámky v Jave
public class Counter {
    private int count = 0;

    public synchronized void increment() {
        count++; // Zámok na objekte, iba jedno vlákno môže vykonať túto metódu naraz
    }

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

Optimistická zámka:

Predpokladá, že konflikty pri prístupe k dátam sú nepravdepodobné. Prístup k dátam sa vykonáva bez zámkov. Pred uložením zmien sa kontroluje, či údaje neboli zmenené iným vláknom od ich načítania. Ak boli zmenené, operácia sa zruší a zvyčajne sa opakuje (retry).

  • Výhody: Vysoká priepustnosť pri nízkej konkurencii, žiadne problémy s deadlockmi.
  • Nevýhody: Môžu nastať konflikty, ktoré vyžadujú opakovanie, čo zložitejšie riadenie.
  • Príklady: Compare-And-Swap (CAS) operácie, verzionovanie v databázach (napr. použitie stĺpca verzie alebo časovej značky).
// Príklad optimistickej zámky s použitím CAS (java.util.concurrent.atomic)
import java.util.concurrent.atomic.AtomicInteger;

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

    public void increment() {
        // Pokus o atómické zvýšenie hodnoty
        // Ak sa hodnota zmenila medzi čítaním a pokusom o aktualizáciu, operácia sa opakuje
        count.incrementAndGet();
    }

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

Porovnanie:

Charakteristika Pesimistická zámka Optimistická zámka
Predpoklad Konflikty sú pravdepodobné Konflikty sú nepravdepodobné
Prístup Zámok pred prístupom Prístup bez zámku, kontrola pri zápise
Pri vysokom tempe konfliktov Môže spôsobiť blokácie, znížiť priepustnosť Časté opakovanie operácií, znížiť výkon
Pri nízkom tempe konfliktov Môže vytvárať dodatočné náklady Vysoká priepustnosť
Problém deadlocku Možný Nie je možný (z pohľadu konkurenčného prístupu ku zdroju)