📅  最后修改于: 2023-12-03 15:31:01.872000             🧑  作者: Mango
在并发编程中,原子操作是指一系列操作,它们执行起来就像是一个单一、不可分割的操作。在 Golang 中,原子操作可以使用 sync/atomic
包来实现,该包提供了一些函数来支持原子操作,例如 AddInt32
、CompareAndSwapInt64
、LoadPointer
、StoreUint32
等函数。
在 Golang 中,原子变量类型使用 sync/atomic
包提供的类型。常用的原子变量类型包括以下几种:
int32
、int64
、uint32
、uint64
:对应原子类型的整数类型;uintptr
:对应原子类型的指针类型;unsafe.Pointer
:对应原子类型的任意指针类型。sync/atomic
包提供了一系列原子操作函数,常见的函数包括以下几种:
AddInt32
、AddInt64
、AddUint32
、AddUint64
:原子地将原子变量的值加上指定的增量,并返回原子变量更新后的值;CompareAndSwapInt32
、 CompareAndSwapInt64
、CompareAndSwapUint32
、CompareAndSwapUint64
:原子地比较原子变量当前的值和旧值,如果相等则将原子变量的值设置为新值,返回一个布尔值表示操作是否成功;LoadInt32
、LoadInt64
、LoadUint32
、LoadUint64
:原子地读取原子变量的值,并返回该值;StoreInt32
、StoreInt64
、StoreUint32
、StoreUint64
:原子地将原子变量设置为指定的值;SwapInt32
、SwapInt64
、SwapUint32
、SwapUint64
:原子地将原子变量的值设置为给定的新值,并返回原来的值。下面是一段示例代码:
package main
import (
"fmt"
"sync/atomic"
)
func main() {
var n int32 = 0
atomic.AddInt32(&n, 1)
fmt.Println(n)
old := atomic.CompareAndSwapInt32(&n, 1, 2)
fmt.Println(n, old)
old = atomic.SwapInt32(&n, 3)
fmt.Println(n, old)
}
在上面的代码中,我们定义了一个 int32
类型的原子变量 n
,然后使用 atomic.AddInt32
函数将其值加 1,并输出其值。接下来,我们使用 atomic.CompareAndSwapInt32
函数比较 n
的当前值和 1 是否相等,如果相等则将 n
的值设置为 2,并将操作是否成功的结果保存在 old
中。最后,我们使用 atomic.SwapInt32
函数将 n
的值设置为 3,并输出其值以及原来的值。