Проверяет понимание пакета atomic в Go для атомарных операций над памятью без блокировок.
Пакет atomic в Go — это часть стандартной библиотеки, которая предоставляет функции для выполнения атомарных операций над памятью. Атомарность означает, что операция выполняется как единое неделимое действие, что предотвращает состояние гонки (race condition) при одновременном доступе из нескольких горутин. В отличие от мьютексов, которые блокируют целые критические секции, atomic работает на уровне отдельных переменных, что делает его более легковесным и быстрым для простых сценариев.
AddT — атомарное сложение (например, AddInt64).LoadT — атомарное чтение значения.StoreT — атомарная запись значения.SwapT — атомарная замена значения с возвратом старого.CompareAndSwapT (CAS) — атомарное сравнение и замена, если значение равно ожидаемому.package main
import (
"fmt"
"sync"
"sync/atomic"
)
func main() {
var counter int64
var wg sync.WaitGroup
for i := 0; i < 1000; i++ {
wg.Add(1)
go func() {
defer wg.Done()
atomic.AddInt64(&counter, 1)
}()
}
wg.Wait()
fmt.Println("Counter:", atomic.LoadInt64(&counter))
}В этом примере 1000 горутин атомарно увеличивают счетчик. Без atomic возникла бы гонка данных, и результат был бы непредсказуем. Использование AddInt64 гарантирует корректность.
Пакет atomic часто используется для реализации:
Пакет atomic следует применять для простых атомарных операций над одиночными переменными, когда требуется высокая производительность и минимальные накладные расходы. Для сложной синхронизации или работы с несколькими переменными лучше использовать мьютексы или каналы.