Sobes.tech
Back to questions
Senior
3

Оптимистичные и пессимистичные блокировки — расскажи

Companies where asked
Cloud.ru

Answer from AI

sobes.tech AI

Оптимистичные и пессимистичные блокировки — два подхода к управлению конкурентным доступом к данным.

  • Пессимистичная блокировка предполагает, что конфликты будут, поэтому блокирует ресурс заранее (например, mutex), чтобы другие не могли его изменить, пока текущий процесс работает. Это предотвращает гонки, но может снижать производительность из-за ожидания.

  • Оптимистичная блокировка предполагает, что конфликты редки. Процесс читает данные без блокировки, а при записи проверяет, не изменились ли данные с момента чтения (например, с помощью версии или временной метки). Если данные изменились — операция откатывается или повторяется.

В Go пессимистичные блокировки реализуются через sync.Mutex или sync.RWMutex. Оптимистичные блокировки требуют дополнительной логики, например, атомарных операций или сравнения версий.

Пример пессимистичной блокировки:

var mu sync.Mutex

mu.Lock()
// критическая секция
mu.Unlock()

Оптимистичная блокировка может выглядеть так (упрощённо):

version := atomic.LoadInt64(&dataVersion)
// читаем данные
// пытаемся записать
if !atomic.CompareAndSwapInt64(&dataVersion, version, version+1) {
    // данные изменились, повторяем
}