Какви са оптимистичните и песимистичните блокировки?
sobes.tech AI
Отговор от AI
Оптимистичните и песимистичните блокировки са подходи за управление на паралелен достъп до общи данни в конкурентни среди (многопоточни приложения, бази данни).
Песимистична блокировка:
Предполага, че конфликтите при достъп до данни са вероятни. Преди да получи достъп до ресурс, потокът или транзакцията го блокира (ексклузивна или споделена блокировка). Други потоци, които се опитват да получат достъп, ще чакат, докато блокировката не бъде премахната.
- Плюсове: Гарантира цялостността на данните, е лесна за реализиране при ниска конкуренция.
- Минуси: Може да доведе до блокирания (deadlocks), намаляване на пропускателната способност при висока конкуренция.
- Примери: ключовата дума
synchronizedв Java, блокировки на ниво ред или таблица в бази данни.
// Пример за песимистична блокировка в Java
public class Counter {
private int count = 0;
public synchronized void increment() {
count++; // Блокиране върху обекта, само един поток може да изпълнява този метод едновременно
}
public synchronized int getCount() {
return count;
}
}
Оптимистична блокировка:
Предполага, че конфликтите при достъп до данни са малко вероятни. Достъпът до данните се извършва без блокировки. Преди запазване на промените се проверява дали данните не са били променени от друг поток след тяхното четене. Ако са променени, операцията се отменя и обикновено се повтаря (retry).
- Плюсове: Висока пропускателна способност при ниска конкуренция, няма проблеми с deadlocks.
- Минуси: Могат да възникнат конфликти, изискващи повторни опити, усложнява логиката. Не е подходящо за дълги операции или с висока вероятност за конфликти.
- Примери: Compare-And-Swap (CAS) операции, управление на версии (versioning) в бази данни (например, използване на колона за версия или времева маркировка).
// Пример за оптимистична блокировка с използване на CAS (java.util.concurrent.atomic)
import java.util.concurrent.atomic.AtomicInteger;
public class AtomicCounter {
private AtomicInteger count = new AtomicInteger(0);
public void increment() {
// Опит за атомично увеличение на стойността
// Ако стойността се промени между четенето и опита за актуализация, операцията се повтаря
count.incrementAndGet();
}
public int getCount() {
return count.get();
}
}
Сравнение:
| Характеристика | Песимистична блокировка | Оптимистична блокировка |
|---|---|---|
| Предположение | Конфликти са вероятни | Конфликти са малко вероятни |
| Подход | Блокиране до достъп | Достъп без блокиране, проверка при запис |
| При висок темп на конфликти | Може да предизвика блокиране, да намали пропускателната способност | Чести повторни операции, да намали производителността |
| При нисък темп на конфликти | Може да създаде допълнителни разходи | Висока пропускателна способност |
| Проблем с deadlock | Възможен | Невъзможен (от гледна точка на конкурентен достъп до ресурс) |