Sobes.tech
Middle

Kas yra optimistiniai ir pesimistiniai blokavimai?

sobes.tech AI

Atsakymas iš AI

Optimistiniai ir pesimistiniai užraktai yra požiūriai į bendrų duomenų prieigos valdymą konkurencinėse aplinkose (daugiagijų programos, duomenų bazės).

Pesimistinis užraktas:

Tikima, kad konfliktai prieigos prie duomenų yra tikėtini. Prieš prieidami prie ištekliaus, srautas arba transakcija jį užrakina (išskirtinį arba bendrinį užraktą). Kiti srautai, bandantys prieiti, lauks, kol užraktas bus atlaisvintas.

  • Privalumai: Užtikrina duomenų vientisumą, paprastas įgyvendinimas mažo konkurencingumo sąlygomis.
  • Trūkumai: Gali sukelti deadlock'us, sumažinti pralaidumą aukšto konkurencingumo sąlygomis.
  • Pavyzdžiai: synchronized žodis Java, užraktai eilutės arba lentelės lygyje duomenų bazėse.
// Pesimistinio užrakto pavyzdys Java
public class Counter {
    private int count = 0;

    public synchronized void increment() {
        count++; // Užraktas objektui, tik vienas srautas gali vykdyti šį metodą vienu metu
    }

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

Optimizuotas užraktas:

Tikima, kad konfliktai prieigos prie duomenų yra nepavojingi. Prieiga prie duomenų vyksta be užraktų. Prieš išsaugant pakeitimus, tikrinama, ar duomenys nebuvo pakeisti kitu srautu nuo jų nuskaitymo. Jei buvo pakeisti, operacija atšaukta ir dažniausiai kartojama (retry).

  • Privalumai: Aukšta pralaidumas mažo konkurencingumo atvejais, nėra deadlock'ų problemų.
  • Trūkumai: Gali įvykti konfliktai, reikalaujantys pakartotinų bandymų, sudėtingina logiką. Netinka ilgalaikėms operacijoms ar dideliam konfliktų tikimybei.
  • Pavyzdžiai: Compare-And-Swap (CAS) operacijos, versijų valdymas duomenų bazėse (pvz., naudojant versijos stulpelį ar laiko žymą).
// Optimizuoto užrakto pavyzdys naudojant CAS (java.util.concurrent.atomic)
import java.util.concurrent.atomic.AtomicInteger;

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

    public void increment() {
        // Atominis didinimas
        // Jei reikšmė pasikeitė tarp skaitymo ir atnaujinimo bandymo, operacija kartojama
        count.incrementAndGet();
    }

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

Palyginimas:

Savybė Pesimistinis užraktas Optimizuotas užraktas
Prielaida Konfliktai tikėtini Konfliktai mažai tikėtini
Prieiga Užraktas prieš prieigą Prieiga be užrakto, patikrinimas rašymo metu
Aukšto konflikto dažnio atveju Gali sukelti užrakinimus, sumažinti pralaidumą Dažni pakartojimai, sumažinti našumą
Žemo konflikto dažnio atveju Gali sukelti papildomas išlaidas Aukštas pralaidumas
Deadlock problema Galimas Neįmanomas (konkurencinio prieigos požiūriu)