前言
在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)
}
输出有可能是
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)
}
总结
在并发操作下,合理使用锁,可以保证数据线程安全,不过具体问题具体分析,互斥锁情况下,也会拖慢并发效率,使用锁的情况下,也要考虑合理减小锁的代码力度