📌  相关文章
📜  Golang 中的 atomic.CompareAndSwapInt64()函数示例(1)

📅  最后修改于: 2023-12-03 15:31:01.142000             🧑  作者: Mango

Golang 中的 atomic.CompareAndSwapInt64() 函数示例

在 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,所以交换成功,输出结果为 true20

接着又调用了一次函数,将 old 参数设置为 30,表示如果 value 的值等于 30,则将其替换为 40。由于此时 value 的值已经被更改为 20,不等于 30,所以交换失败,输出结果为 false20

总结

atomic.CompareAndSwapInt64() 函数可以帮助我们在并发环境中更安全地进行操作,并且它是原子性的,因此可以确保操作的准确性和可靠性。在使用该函数时,需要注意参数要传递指针类型,以确保操作的是变量的内存地址,而不是变量的值。