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) |