📅  最后修改于: 2023-12-03 15:31:01.142000             🧑  作者: Mango
在 Go 语言中,atomic
包提供了一些原子操作,这些操作可以帮助我们构建高效且线程安全的程序。其中之一是 atomic.CompareAndSwapInt64()
函数,它可以用来原子性地比较并交换一个 int64
值。
func CompareAndSwapInt64(addr *int64, old, new int64) (swapped bool)
该函数会将指针 addr
指向的值与 old
比较,如果相等,就将其替换为 new
。函数返回布尔值 swapped
,表示值是否被替换。
下面是一个使用 atomic.CompareAndSwapInt64()
的示例程序:
package main
import (
"fmt"
"sync/atomic"
)
func main() {
var value int64 = 10
fmt.Println("原始值:", value)
swapped := atomic.CompareAndSwapInt64(&value, 10, 20)
fmt.Printf("交换是否成功:%v,现在的值:%d\n", swapped, value)
swapped = atomic.CompareAndSwapInt64(&value, 30, 40)
fmt.Printf("交换是否成功:%v,现在的值:%d\n", swapped, value)
}
输出结果为:
原始值: 10
交换是否成功:true,现在的值:20
交换是否成功:false,现在的值:20
在该示例程序中,首先将变量 value
初始化为 10
,然后调用 atomic.CompareAndSwapInt64()
函数进行比较和交换操作。第一次调用函数时,将 old
参数设置为 10
,表示如果 value
的值等于 10
,则将该值替换为 20
。因为 value
的初值为 10
,所以交换成功,输出结果为 true
和 20
。
接着又调用了一次函数,将 old
参数设置为 30
,表示如果 value
的值等于 30
,则将其替换为 40
。由于此时 value
的值已经被更改为 20
,不等于 30
,所以交换失败,输出结果为 false
和 20
。
atomic.CompareAndSwapInt64()
函数可以帮助我们在并发环境中更安全地进行操作,并且它是原子性的,因此可以确保操作的准确性和可靠性。在使用该函数时,需要注意参数要传递指针类型,以确保操作的是变量的内存地址,而不是变量的值。