【Go】互斥锁实现操作A存在时,操作B永远不执行

44 阅读1分钟

实际业务中,有一个逻辑是

  1. 每10s定时从板卡通过gRPC读取配置,更新到库中
  2. 用户可以修改板卡信息,更新库后,再通过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结束