Sobes.tech
Middle

Šta su optimističke i pesimističke blokade?

sobes.tech АИ

Одговор од АИ

Optimistične i pesimistične blokade su pristupi upravljanju paralelnim pristupom zajedničkim podacima u konkurentnim okruženjima (multithread aplikacije, baze podataka).

Pesimistična blokada:

Pretpostavlja da su konflikti pri pristupu podacima verovatni. Pre nego što pristupi resursu, nit ili transakcija ga zaključava (ekskluzivno ili deljeno). Druge niti koje pokušavaju da pristupe će čekati dok se zaključavanje ne ukloni.

  • Prednosti: Osigurava integritet podataka, jednostavna je za implementaciju pri niskoj konkurenciji.
  • Nedostaci: Može dovesti do blokada (deadlockova), smanjenja propusnosti pri visokoj konkurenciji.
  • Primeri: ključna reč synchronized u Javi, zaključavanja na nivou reda ili tabele u bazama podataka.
// Primer pesimističnog zaključavanja u Javi
public class Counter {
    private int count = 0;

    public synchronized void increment() {
        count++; // Zaključavanje na objektu, samo jedan nit može izvršiti ovu metodu istovremeno
    }

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

Optimizaciono zaključavanje:

Pretpostavlja da su konflikti pri pristupu podacima retki. Pristup podacima se vrši bez zaključavanja. Pre čuvanja promena, proverava se da li su podaci izmenjeni od strane drugog nita od njihovog čitanja. Ako jesu, operacija se otkazuje i obično se ponavlja (retry).

  • Prednosti: Visoka propusnost pri niskoj konkurenciji, nema problema sa deadlockovima.
  • Nedostaci: Mogući konflikti koji zahtevaju ponovne pokušaje, što komplikuje logiku. Nije pogodno za duge operacije ili visoku verovatnoću konflikata.
  • Primeri: Compare-And-Swap (CAS) operacije, upravljanje verzijama u bazama podataka (npr. korišćenje kolone verzije ili vremenske oznake).
// Primer optimističnog zaključavanja korišćenjem CAS (java.util.concurrent.atomic)
import java.util.concurrent.atomic.AtomicInteger;

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

    public void increment() {
        // Pokušaj atomskog povećanja vrednosti
        // Ako se vrednost promeni između čitanja i pokušaja ažuriranja, operacija se ponovo pokušava
        count.incrementAndGet();
    }

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

Uporedjenje:

Karakteristika Pesimistična blokada Optimizaciona blokada
Pretpostavka Konflikti su verovatni Konflikti su malo verovatni
Pristup Zaključavanje do pristupa Pristup bez zaključavanja, provera pri zapisu
Pri visokoj brzini konflikata Može izazvati blokade, smanjiti propusnost Česti ponovni pokušaji, smanjiti performanse
Pri niskoj brzini konflikata Može stvoriti dodatne troškove Visoka propusnost
Problem deadlocka Moguće Nemoguće (iz perspektive konkurentnog pristupa resursu)