Тип atomic.Int32

Тип atomic.Int32 предоставляет атомарные операции над 32-битным целым числом со знаком. Этот тип из пакета sync/atomic позволяет безопасно выполнять операции над числом из нескольких горутин без использования мьютексов. Основные методы типа: Load для чтения значения, Store для записи, Add для прибавления числа, Swap для обмена значения и CompareAndSwap для условной замены значения.

Синтаксис

govar num atomic.Int32
num.Store(42)
value := num.Load()
num.Add(10)
old := num.Swap(100)
swapped := num.CompareAndSwap(100, 200)

Пример

Давайте создадим атомарную переменную и выполним базовые операции с ней:

gopackage 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())
}

Результат выполнения кода:

go"Stored value: 42"
"After add 10: 52"
"Old value: 52"
"New value: 100"
"CAS success: true"
"Final value: 200"

Пример

Давайте используем атомарную переменную для безопасного инкремента счетчика из нескольких горутин:

gopackage 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())
}

Результат выполнения кода:

go"Counter: 1000"

Пример

Давайте используем метод CompareAndSwap для безопасного обновления значения только если оно не изменилось:

gopackage 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())
}

Результат выполнения кода:

go"First CAS: true"
"Value: 200"
"Second CAS: false"
"Value: 200"

Смотрите также

  • тип atomic.Int64,
    атомарное 64-битное целое число
  • тип atomic.Uint32,
    атомарное 32-битное беззнаковое целое
  • функцию atomic.AddInt32,
    атомарное сложение для int32
  • тип sync.Mutex,
    мьютекс для синхронизации доступа к данным