(18条消息) Go语言自学系列 | golang并发编程之原子变量的引入_COCOgsta的博客-CSDN博客_go 原子变量



Go语言自学系列 | golang并发编程之原子变量的引入

COCOgsta 已于 2022-04-09 20:58:21 修改 83 收藏
分类专栏: 视频学习笔记 文章标签: golang go

视频来源:B站《golang入门到项目实战 [2021最新Go语言教程,没有废话,纯干货!持续更新中...]》

一边学习一边整理老师的课程内容及试验笔记,并与大家分享,侵权即删,谢谢支持!

附上汇总贴:Go语言自学系列 | 汇总_COCOgsta的博客-CSDN博客


先看一个实例

  1. 1
    package main
  2. 2
  3. 3
    import (
  4. 4
    "fmt"
  5. 5
    "sync"
  6. 6
    "time"
  7. 7
    )
  8. 8
  9. 9
    var i = 100
  10. 10
    var lock sync.Mutex
  11. 11
  12. 12
    func add() {
  13. 13
    lock.Lock()
  14. 14
    i++
  15. 15
    lock.Unlock()
  16. 16
    }
  17. 17
  18. 18
    func sub() {
  19. 19
    lock.Lock()
  20. 20
    i--
  21. 21
    lock.Unlock()
  22. 22
    }
  23. 23
  24. 24
    func main() {
  25. 25
    for i := 0; i < 100; i++ {
  26. 26
    go add()
  27. 27
    go sub()
  28. 28
    }
  29. 29
  30. 30
    time.Sleep(time.Second * 3)
  31. 31
    fmt.Printf("i: %v\n", i)
  32. 32
  33. 33
    }
  34. 34
  35. 35

运行结果

  1. 1
    [Running] go run "d:\SynologyDrive\软件开发\go\golang入门到项目实战\goproject\360duote.com\pro01\test.go"
  2. 2
    i: 100

这是我们之前的写法,使用锁实现协程的同步

下面使用原子操作

  1. 1
    package main
  2. 2
  3. 3
    import (
  4. 4
    "fmt"
  5. 5
    "sync/atomic"
  6. 6
    "time"
  7. 7
    )
  8. 8
  9. 9
    var i int32 = 100
  10. 10
  11. 11
    func add() {
  12. 12
    atomic.AddInt32(&i, 1)
  13. 13
    }
  14. 14
  15. 15
    func sub() {
  16. 16
    atomic.AddInt32(&i, -1)
  17. 17
    }
  18. 18
  19. 19
    func main() {
  20. 20
    for i := 0; i < 100; i++ {
  21. 21
    go add()
  22. 22
    go sub()
  23. 23
    }
  24. 24
  25. 25
    time.Sleep(time.Second * 3)
  26. 26
    fmt.Printf("i: %v\n", i)
  27. 27
  28. 28
    }
  29. 29

运行结果

  1. 1
    [Running] go run "d:\SynologyDrive\软件开发\go\golang入门到项目实战\goproject\360duote.com\pro01\test.go"
  2. 2
    i: 100


yg9538 2022年7月22日 22:48 282 收藏文档