Есть ли в Go Lock-free структура данных

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

Ответ

В Go нет встроенных lock-free структур данных в стандартной библиотеке, но их можно реализовать с помощью атомарных операций из пакета sync/atomic. Например, простейший lock-free счетчик:

import "sync/atomic"

type Counter struct {
    value int64
}

func (c *Counter) Increment() {
    atomic.AddInt64(&c.value, 1)
}

func (c *Counter) Get() int64 {
    return atomic.LoadInt64(&c.value)
}

Для более сложных структур (очереди, стеки) обычно используют:

  1. Атомарные операции (CAS - Compare-And-Swap)
  2. Hazard pointers (в Go нет прямой поддержки)
  3. Алгоритмы типа Michael-Scott для очередей

Важные нюансы:

  • Lock-free ≠ wait-free (все еще возможны contention)
  • Требуется аккуратная реализация
  • В Go 1.19+ появились новые атомарные типы (atomic.Int64 и др.)

Полноценные lock-free структуры обычно берут из сторонних библиотек (например, github.com/loov/hrtime).