Middle
Kas ir optimistiskās un pesimistiskās bloķēšanas?
sobes.tech AI
Atbilde no AI
Optimistiskās un pesimistiskās bloķēšanas ir pieejas, kā pārvaldīt paralēlo piekļuvi kopīgajiem datiem konkurējošās vidēs (vairāku pavedienu lietojumprogrammas, datu bāzes).
Pesimistiskā bloķēšana:
Pieņem, ka konflikti pie datu piekļuves ir iespējami. Pirms piekļuves resursam pavedienu vai transakcija uzliek tam bloķējumu (ekskluzīvu vai koplietošanas). Citas pavedieni, kas mēģina piekļūt tam, gaidīs, kamēr bloķējums tiks noņemts.
- Priekšrocības: Nodrošina datu integritāti, vienkārša īstenošana mazā konkurencē.
- Trūkumi: Var novest pie gaidīšanas (bloķēšanas), samazinot caurlaidību augstas konkurences gadījumā (deadlock).
- Piemēri: vārds
synchronizedJava, bloķējumi līnijas vai tabulas līmenī datu bāzēs.
// Pesimistiskās bloķēšanas piemērs Java
public class Counter {
private int count = 0;
public synchronized void increment() {
count++; // Bloķējums uz objekta, tikai viens pavedienu var izpildīt šo metodi vienlaikus
}
public synchronized int getCount() {
return count;
}
}
Optimistiskā bloķēšana:
Pieņem, ka konflikti pie datu piekļuves ir mazticami. Piekļuve datiem notiek bez bloķējumiem. Pirms izmaiņu saglabāšanas pārbauda, vai datu kopija nav mainījusies cita pavediena laikā. Ja ir, operācija tiek atcelta un parasti atkārtota (retry).
- Priekšrocības: Augsta caurlaidība mazā konkurencē, nav problēmu ar deadlock.
- Trūkumi: Var rasties konflikti, kas prasa atkārtotas mēģināšanas, sarežģot loģiku. Nepiemērots ilgstošām operācijām vai ar lielu konfliktu varbūtību.
- Piemēri: Compare-And-Swap (CAS) operācijas, versiju vadība (versioning) datu bāzēs (piemēram, izmantojot versijas kolonnu vai laika zīmogu).
// Optimistiskās bloķēšanas piemērs ar CAS (java.util.concurrent.atomic)
import java.util.concurrent.atomic.AtomicInteger;
public class AtomicCounter {
private AtomicInteger count = new AtomicInteger(0);
public void increment() {
// Mēģinājums atomiski palielināt vērtību
// Ja vērtība mainās starp nolasīšanu un mēģinājumu atjaunināt, operācija tiks atkārtota
count.incrementAndGet();
}
public int getCount() {
return count.get();
}
}
Salīdzinājums:
| Raksturlielums | Pesimistiskā bloķēšana | Optimistiskā bloķēšana |
|---|---|---|
| Pieņēmums | Konflikti ir iespējami | Konflikti ir maz ticami |
| Pieejas veids | Bloķēšana pirms piekļuves | Piekļuve bez bloķēšanas, pārbaude rakstīšanas laikā |
| Augstas konfliktu intensitātes gadījumā | Var izraisīt bloķēšanu, samazināt caurlaidību | Bieži atkārtotas operācijas, samazinot veiktspēju |
| Zemas konfliktu intensitātes gadījumā | Var radīt papildu izmaksas | Augsta caurlaidība |
| Deadlock problēma | Iespējama | Nav iespējama (no konkurējošas piekļuves resursam viedokļa) |