Тип atomic.Uint32
Тип atomic.Uint32 из пакета sync/atomic
представляет собой атомарное беззнаковое 32-битное целое
число. Он предоставляет методы для безопасного выполнения
операций чтения, записи, сложения и сравнения с обменом
без использования явных блокировок. Этот тип полезен для
счетчиков, флагов и других числовых значений, к которым
обращаются из нескольких горутин.
Синтаксис
var v atomic.Uint32
v.Store(100)
value := v.Load()
v.Add(10)
Пример
Давайте создадим счетчик с использованием atomic.Uint32
и инкрементируем его из нескольких горутин:
package main
import (
"fmt"
"sync"
"sync/atomic"
)
func main() {
var counter atomic.Uint32
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.Load())
}
Результат выполнения кода:
1000
Пример
Используем методы Store и Load для безопасной
записи и чтения значения:
package main
import (
"fmt"
"sync/atomic"
)
func main() {
var val atomic.Uint32
val.Store(42)
fmt.Println(val.Load())
val.Store(100)
fmt.Println(val.Load())
}
Результат выполнения кода:
42
100
Пример
Метод CompareAndSwap атомарно сравнивает значение
с ожидаемым и заменяет его на новое, если они равны:
package main
import (
"fmt"
"sync/atomic"
)
func main() {
var val atomic.Uint32
val.Store(10)
swapped := val.CompareAndSwap(10, 20)
fmt.Println(swapped)
fmt.Println(val.Load())
swapped = val.CompareAndSwap(10, 30)
fmt.Println(swapped)
fmt.Println(val.Load())
}
Результат выполнения кода:
true
20
false
20
Смотрите также
-
тип
atomic.Uint64,
который предоставляет атомарное беззнаковое 64-битное целое -
тип
atomic.Int32,
который предоставляет атомарное знаковое 32-битное целое -
функцию
atomic.AddUint32,
которая атомарно прибавляет значение кuint32 -
функцию
atomic.LoadUint32,
которая атомарно загружает значение типаuint32