Go并发锁,并发注意事项

客官°小女子只卖身不卖艺 2022-11-09 12:42 280阅读 0赞

go run -race xxx.go可以看下并发的时候是否存在数据竞争问题

Go并发锁,需要注意的地方是,并发读写公共变量时候需要加锁,加锁完赋值给临时变量,然后立马解锁以免影响其他地方需要获取锁的操作。

  1. package main
  2. import (
  3. "fmt"
  4. "sync"
  5. "time"
  6. )
  7. var Number int = 0
  8. var NowNUM int = 0
  9. var Lk = sync.RWMutex{}
  10. func main(){
  11. fmt.Println("初始数据是:",Number,"开始时间:",time.Now().Format("2006-01-02 15:04:05"))
  12. //linux可开40W个协程,测试机单核2G内存
  13. for i:=0;i<1000;i++{
  14. Lk.Lock()
  15. NowNUM++
  16. Lk.Unlock()
  17. go test01(i)
  18. }
  19. Lk.Lock()
  20. fmt.Println("开启全部协程后的数量是:",NowNUM)
  21. Lk.Unlock()
  22. for{
  23. Lk.Lock()
  24. num:=NowNUM
  25. Lk.Unlock()
  26. if num ==0{
  27. fmt.Println("结束时间:",time.Now().Format("2006-01-02 15:04:05"),"now is :",num)
  28. break
  29. }
  30. time.Sleep(200*time.Millisecond)
  31. }
  32. }
  33. func test01(ttt int){
  34. //任务完成,减少任务数量
  35. Lk.Lock()
  36. NowNUM--
  37. Lk.Unlock()
  38. go test03()
  39. time.Sleep(1*time.Second)
  40. }
  41. func test03(){
  42. //任务完成,减少任务数量
  43. Lk.Lock()
  44. NowNUM++
  45. Lk.Unlock()
  46. go test04()
  47. time.Sleep(1*time.Second)
  48. }
  49. func test04(){
  50. time.Sleep(1*time.Second)
  51. //任务完成,减少任务数量
  52. Lk.Lock()
  53. fmt.Println("当前协程数量",NowNUM)
  54. NowNUM--
  55. Lk.Unlock()
  56. }

开发中除了并发读取公共数据的时候,还需要注意的是,切片,map,函数,指针是按引用传递的,你传递切片过去某个函数里面更改了数据,外面的也会一起被更改的。

go sync wait group deadlock死锁问题注意 https://blog.csdn.net/qq_27517377/article/details/114927753?spm=1001.2014.3001.5501

发表评论

表情:
评论列表 (有 0 条评论,280人围观)

还没有评论,来说两句吧...

相关阅读