go中sync.Mutex互斥锁

194 阅读1分钟

前言

在go中,如果多个协程并发操作一个数据,会出现线程不安全现象,那么就需要锁来保证线程安全

sync.Mutex使用

多个协程操作线程不安全

package main

import (
   "fmt"
   "sync"
)

var x int64
var wg sync.WaitGroup

func add() {
   for i := 0; i < 10_00; i++ {
      x = x + 1
   }
   wg.Done()
}
func main() {
   wg.Add(5)
   for i := 0; i < 5; i++ {
      go add()
   }
   wg.Wait()
   fmt.Println(x)
}

输出有可能是

1714718672981.png

image.png sync.Mutex使用

package main

import (
   "fmt"
   "sync"
)

var x int64
var wg sync.WaitGroup
var lock sync.Mutex

func add() {
   for i := 0; i < 10_00; i++ {
      lock.Lock()
      x = x + 1
      lock.Unlock()
   }
   wg.Done()
}
func main() {
   wg.Add(5)
   for i := 0; i < 5; i++ {
      go add()
   }
   wg.Wait()
   fmt.Println(x)
}

image.png

总结

在并发操作下,合理使用锁,可以保证数据线程安全,不过具体问题具体分析,互斥锁情况下,也会拖慢并发效率,使用锁的情况下,也要考虑合理减小锁的代码力度