实际业务中,有一个逻辑是
- 每10s定时从板卡通过gRPC读取配置,更新到库中
- 用户可以修改板卡信息,更新库后,再通过gRPC设置板卡 在操作2时,操作1应该被阻止,否则会有几率导致用户的操作正好被操作1覆盖掉,再过10s又被同步上来
因此应用到Go的互斥锁来实现,具体Demo代码如下
func main() {
// 创建互斥锁
var mutex sync.Mutex
go func() {
fmt.Println("主写操作开始")
mutex.Lock()
defer mutex.Unlock()
time.Sleep(5 * time.Second)
fmt.Println("主写操作结束")
}()
for i := 0; i < 10; i++ {
go func(index int) {
fmt.Println("写操作" + strconv.Itoa(index) + "开始")
// 尝试获取互斥锁
if !mutex.TryLock() {
fmt.Println("写操作" + strconv.Itoa(index) + "被拒绝")
return
} else {
mutex.Unlock()
}
time.Sleep(5 * time.Second)
fmt.Println("写操作" + strconv.Itoa(index) + "结束")
}(i)
time.Sleep(time.Second)
}
select {}
}
打印出来的结果为:
主写操作开始
写操作0开始
写操作0被拒绝
写操作1开始
写操作1被拒绝
写操作2开始
写操作2被拒绝
写操作3开始
写操作3被拒绝
写操作4开始
写操作4被拒绝
主写操作结束
写操作5开始
写操作6开始
写操作7开始
写操作8开始
写操作9开始
写操作5结束
写操作6结束
写操作7结束
写操作8结束
写操作9结束