Тип atomic.Int32
Тип atomic.Int32 предоставляет атомарные операции
над 32-битным целым числом со знаком. Этот тип из пакета
sync/atomic позволяет безопасно выполнять операции
над числом из нескольких горутин без использования мьютексов.
Основные методы типа: Load для чтения значения,
Store для записи, Add для прибавления числа,
Swap для обмена значения и CompareAndSwap
для условной замены значения.
Синтаксис
var num atomic.Int32
num.Store(42)
value := num.Load()
num.Add(10)
old := num.Swap(100)
swapped := num.CompareAndSwap(100, 200)
Пример
Давайте создадим атомарную переменную и выполним базовые операции с ней:
package main
import (
"fmt"
"sync/atomic"
)
func main() {
var num atomic.Int32
// Store value
num.Store(42)
fmt.Println("Stored value:", num.Load())
// Add value
num.Add(10)
fmt.Println("After add 10:", num.Load())
// Swap value
old := num.Swap(100)
fmt.Println("Old value:", old)
fmt.Println("New value:", num.Load())
// Compare and swap
swapped := num.CompareAndSwap(100, 200)
fmt.Println("CAS success:", swapped)
fmt.Println("Final value:", num.Load())
}
Результат выполнения кода:
"Stored value: 42"
"After add 10: 52"
"Old value: 52"
"New value: 100"
"CAS success: true"
"Final value: 200"
Пример
Давайте используем атомарную переменную для безопасного инкремента счетчика из нескольких горутин:
package main
import (
"fmt"
"sync"
"sync/atomic"
)
func main() {
var counter atomic.Int32
var wg sync.WaitGroup
for i := 0; i < 1000; i++ {
wg.Add(1)
go func() {
defer wg.Done()
counter.Add(1)
}()
}
wg.Wait()
fmt.Println("Counter:", counter.Load())
}
Результат выполнения кода:
"Counter: 1000"
Пример
Давайте используем метод CompareAndSwap для
безопасного обновления значения только если оно не изменилось:
package main
import (
"fmt"
"sync/atomic"
)
func main() {
var value atomic.Int32
value.Store(100)
// Try to update if value is still 100
ok := value.CompareAndSwap(100, 200)
fmt.Println("First CAS:", ok)
fmt.Println("Value:", value.Load())
// Try to update if value is still 100 (it's now 200)
ok = value.CompareAndSwap(100, 300)
fmt.Println("Second CAS:", ok)
fmt.Println("Value:", value.Load())
}
Результат выполнения кода:
"First CAS: true"
"Value: 200"
"Second CAS: false"
"Value: 200"
Смотрите также
-
тип
atomic.Int64,
атомарное 64-битное целое число -
тип
atomic.Uint32,
атомарное 32-битное беззнаковое целое -
функцию
atomic.AddInt32,
атомарное сложение для int32 -
тип
sync.Mutex,
мьютекс для синхронизации доступа к данным