Что такое ABA проблема

«Что такое ABA проблема» — вопрос из категории Golang, который задают на 23% собеседований Golang Разработчик. Ниже — развёрнутый ответ с разбором ключевых моментов.

Ответ

ABA проблема возникает в lock-free алгоритмах, когда значение переменной меняется с A на B и обратно на A, хотя между этими изменениями могли произойти другие операции. Это может привести к некорректной работе алгоритма, если он полагается только на сравнение значений.

Пример в Go с sync/atomic:

var sharedValue int64 = 10 // A

// Горутина 1
go func() {
    atomic.CompareAndSwapInt64(&sharedValue, 10, 20) // A -> B
    atomic.CompareAndSwapInt64(&sharedValue, 20, 10) // B -> A
}()

// Горутина 2
go func() {
    time.Sleep(time.Millisecond)
    // Условие выполнится, хотя значение временно менялось
    if atomic.CompareAndSwapInt64(&sharedValue, 10, 30) {
        // Операция успешна, но могла пропустить изменения
    }
}()

Для решения используют:

  • Версионные указатели (stamped references)
  • Двойные CAS операции
  • Hazard pointers
  • RCU (Read-Copy-Update)