Ответ
В 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)
}
Для более сложных структур (очереди, стеки) обычно используют:
- Атомарные операции (CAS - Compare-And-Swap)
- Hazard pointers (в Go нет прямой поддержки)
- Алгоритмы типа Michael-Scott для очередей
Важные нюансы:
- Lock-free ≠ wait-free (все еще возможны contention)
- Требуется аккуратная реализация
- В Go 1.19+ появились новые атомарные типы (
atomic.Int64и др.)
Полноценные lock-free структуры обычно берут из сторонних библиотек (например, github.com/loov/hrtime).