Go并发锁,并发注意事项
go run -race xxx.go可以看下并发的时候是否存在数据竞争问题
Go并发锁,需要注意的地方是,并发读写公共变量时候需要加锁,加锁完赋值给临时变量,然后立马解锁以免影响其他地方需要获取锁的操作。
package main
import (
"fmt"
"sync"
"time"
)
var Number int = 0
var NowNUM int = 0
var Lk = sync.RWMutex{}
func main(){
fmt.Println("初始数据是:",Number,"开始时间:",time.Now().Format("2006-01-02 15:04:05"))
//linux可开40W个协程,测试机单核2G内存
for i:=0;i<1000;i++{
Lk.Lock()
NowNUM++
Lk.Unlock()
go test01(i)
}
Lk.Lock()
fmt.Println("开启全部协程后的数量是:",NowNUM)
Lk.Unlock()
for{
Lk.Lock()
num:=NowNUM
Lk.Unlock()
if num ==0{
fmt.Println("结束时间:",time.Now().Format("2006-01-02 15:04:05"),"now is :",num)
break
}
time.Sleep(200*time.Millisecond)
}
}
func test01(ttt int){
//任务完成,减少任务数量
Lk.Lock()
NowNUM--
Lk.Unlock()
go test03()
time.Sleep(1*time.Second)
}
func test03(){
//任务完成,减少任务数量
Lk.Lock()
NowNUM++
Lk.Unlock()
go test04()
time.Sleep(1*time.Second)
}
func test04(){
time.Sleep(1*time.Second)
//任务完成,减少任务数量
Lk.Lock()
fmt.Println("当前协程数量",NowNUM)
NowNUM--
Lk.Unlock()
}
开发中除了并发读取公共数据的时候,还需要注意的是,切片,map,函数,指针是按引用传递的,你传递切片过去某个函数里面更改了数据,外面的也会一起被更改的。
go sync wait group deadlock死锁问题注意 https://blog.csdn.net/qq_27517377/article/details/114927753?spm=1001.2014.3001.5501
还没有评论,来说两句吧...