读写锁处理线程竞争
注意:循环切片数据时,注意遍历后的`v`地址是相同的(在for代码块中,for生命周期内,创建的变量v生命周期内地址不变)
package main
import (
"sync"
"app01/controller"
"app01/service"
"app01/conf"
)
var (
rwlock sync.RWMutex
)
func updateProductInfo() {
var tmp map[int]*service.SecProductInfo = make(map[int]*service.SecProductInfo, 1024)
ProductInfo, err := <- conf.SecProductChan // 从chan中获取数据
for _, v range ProductInfo {
pro := &v // 重新赋值,否则引用地址相同
tmp[v.Pid] = pro
}
// 数据重新写入map
rwlock.Lock()
service.SecProductInfoMap = tmp
rmlock.Unlock()
}
func main() {
for i := 0; i<5; i++ {
go updateProductInfo() // 开启5个子协程
}
}