Go的原子性使用

字号+ 编辑: IT男在阿里 修订: SyncLWT 来源: 利志分享 2023-09-11 我要说两句(0)

以代码的方式解释Go语言原子性使用方法。

package main

import (  
    "fmt"  
    "runtime"  
    "sync/atomic"  
    "time"  
)

func main() {  
    // 定义一个整数  
    var ops uint64 = 0  

    // 使用50个协程给ops累加数值
    for i := 0; i < 50; i++ {
        go func() {
            // 这里是循环多少次未知
            for {
                atomic.AddUint64(&ops, 1)
                // 这个函数用于时间片切换,可以理解为高级版的time.Sleep(),避免前面的for循环将CPU时间片都卡在一个线程里,使得其它线程没有执行机会
                // runtime.Gosched()表示让CPU把时间片让给别人,下次某个时候继续恢复执行该goroutine,自己一般是阻塞了,这是一个很高级的sleep,我们经常会遇到要sleep多久的问题,这里不用考虑了,别人完成后,自然会通知你。
                runtime.Gosched()
            }
        }()
    }

    // 停一秒,上面50个线程有1秒的执行时间
    time.Sleep(time.Second)

    // 获取结果
    opsFinal := atomic.LoadUint64(&ops)
    fmt.Println("ops:", opsFinal)

    //
    var tmpOps int64 = 0
    t1 := time.Now().UnixNano()
    //执行n个线程执行原子操作
    for tmpOps < 10000000 {
        go func() {
            atomic.AddInt64(&tmpOps, 1)
        }()
    }
    t2 := time.Now().UnixNano()
    t := t2 - t1
    fmt.Println(t)
    fmt.Println(tmpOps)

}
阅完此文,您的感想如何?
  • 有用

    0

  • 没用

    0

  • 开心

    0

  • 愤怒

    0

  • 可怜

    0

1.如文章侵犯了您的版权,请发邮件通知本站,该文章将在24小时内删除;
2.本站标注原创的文章,转发时烦请注明来源;
3.Q群: 2702237 13835667

相关课文
  • GO语言GORM如何更新字段

  • gorm如何创建记录与模型定义需要注意什么

  • gorm一般查询与高级查询

  • GORM时间戳跟踪及CURD(增删改查)

我要说说
网上嘉宾点评