千锋教育-做有情怀、有良心、有品质的职业教育机构

手机站
千锋教育

千锋学习站 | 随时随地免费学

千锋教育

扫一扫进入千锋手机站

领取全套视频
千锋教育

关注千锋学习站小程序
随时随地免费学习课程

当前位置:首页  >  技术干货  > Golang中的原子操作Atomic详解

Golang中的原子操作Atomic详解

来源:千锋教育
发布人:xqq
时间: 2023-12-27 07:52:41 1703634761

Golang中的原子操作Atomic详解

在并发编程中,原子操作被广泛使用,可以保证在多个并发协程中,访问同一资源时的并发安全。原子操作就是在一个操作中,不可中断地完成了多个步骤,同时保证所有步骤的正确性和完整性。在Golang中,原子操作被封装在了sync/atomic包中,提供了一系列函数来实现原子操作。

Golang中的原子操作主要包含三个方面:

1.原子读写操作

2.原子加减操作

3.原子比较与交换操作

接下来,我们将对每个方面进行详细的介绍。

1. 原子读写操作

原子读写操作是指对于一个变量的读写操作,保证在并发环境下的正确性。在Golang中,sync/atomic包提供了两个函数来实现原子读写操作:

func LoadInt32(addr *int32) (val int32)func StoreInt32(addr *int32, val int32)

其中,LoadInt32()函数用于原子性地读取整型变量的值,StoreInt32()函数用于原子性地设置整型变量的值。

例如,我们可以使用以下代码进行原子读写操作:

var counter int32  func incCounter() {      atomic.AddInt32(&counter, 1)  }  func main() {      go incCounter()      go incCounter()      time.Sleep(time.Second)      fmt.Println(atomic.LoadInt32(&counter))  }  

在上面的代码中,我们定义了一个counter变量,然后使用两个协程对其进行自增操作。最后,使用atomic.LoadInt32()函数原子地读取counter变量的值并输出。

2. 原子加减操作

原子加减操作是指在并发环境下,对于一个整型变量进行增加或减少操作,保证其正确性。在Golang中,sync/atomic包提供了一些函数来实现原子加减操作。常见的原子加减操作函数如下:

func AddInt32(addr *int32, delta int32) (new int32)func AddInt64(addr *int64, delta int64) (new int64)func AddUint32(addr *uint32, delta uint32) (new uint32)func AddUint64(addr *uint64, delta uint64) (new uint64)

例如,我们可以使用以下代码来实现对于一个变量进行原子加减操作:

var counter int32  func incCounter() {      atomic.AddInt32(&counter, 1)  }  func main() {      go incCounter()      go incCounter()      time.Sleep(time.Second)      fmt.Println(atomic.LoadInt32(&counter))  }  

在上面的代码中,我们使用atomic.AddInt32()函数对counter变量进行原子自增操作。

3. 原子比较与交换操作

原子比较与交换操作是指在并发环境中,对于一个变量,当其值满足某个条件时,将其设置成一个新的值,这个操作需要进行比较和交换,而且在并发环境下保证正确性。在Golang中,sync/atomic包提供了一些函数来实现原子比较与交换操作。

常见的原子比较与交换操作函数如下:

func CompareAndSwapInt32(addr *int32, old, new int32) (swapped bool)func CompareAndSwapInt64(addr *int64, old, new int64) (swapped bool)func CompareAndSwapUint32(addr *uint32, old, new uint32) (swapped bool)func CompareAndSwapUint64(addr *uint64, old, new uint64) (swapped bool)

例如,我们可以使用以下代码来实现原子比较与交换操作:

var counter int32  func incCounter() {      for {          oldValue := atomic.LoadInt32(&counter)          if atomic.CompareAndSwapInt32(&counter, oldValue, oldValue+1) {              break          }      }  }  func main() {      go incCounter()      go incCounter()      time.Sleep(time.Second)      fmt.Println(atomic.LoadInt32(&counter))  }  

在上面的代码中,我们使用了for循环和atomic.CompareAndSwapInt32()函数来实现自增操作。在循环中,首先使用atomic.LoadInt32()函数原子地读取counter变量的值。如果读取的值等于oldValue,则使用atomic.CompareAndSwapInt32()函数将counter变量的值设置成oldValue+1,否则继续循环直到成功。

总结

在本文中,我们详细地介绍了Golang中的原子操作。原子操作是并发编程中的重要概念,可以保证在并发环境下访问同一资源的正确性和完整性。在Golang中,sync/atomic包提供了一系列函数来实现原子操作,包括原子读写操作、原子加减操作和原子比较与交换操作等。通过合理地使用这些函数,可以保证程序在并发环境下的正确性和效率。

以上就是IT培训机构千锋教育提供的相关内容,如果您有web前端培训鸿蒙开发培训python培训linux培训,java培训,UI设计培训等需求,欢迎随时联系千锋教育。

tags:
声明:本站稿件版权均属千锋教育所有,未经许可不得擅自转载。
10年以上业内强师集结,手把手带你蜕变精英
请您保持通讯畅通,专属学习老师24小时内将与您1V1沟通
免费领取
今日已有369人领取成功
刘同学 138****2860 刚刚成功领取
王同学 131****2015 刚刚成功领取
张同学 133****4652 刚刚成功领取
李同学 135****8607 刚刚成功领取
杨同学 132****5667 刚刚成功领取
岳同学 134****6652 刚刚成功领取
梁同学 157****2950 刚刚成功领取
刘同学 189****1015 刚刚成功领取
张同学 155****4678 刚刚成功领取
邹同学 139****2907 刚刚成功领取
董同学 138****2867 刚刚成功领取
周同学 136****3602 刚刚成功领取
相关推荐HOT