非常重要的关键量,就需要加锁,避免超出。(比如“超卖问题”)
程序1是不加锁的情况,顺序是乱的。程序2就是加速的情况,不会乱。
package main
import (
"fmt"
"sync"
"time"
)
var (
m sync.Mutex
v1 int
)
func change(i int) {
// 获取锁,也就是加锁
// 如果锁被占用,这里就会等待堵塞
// m.Lock()
// 利用延迟模拟数据处理需要的时间
time.Sleep(time.Second)
v1 = v1 + 1
// 释放锁,也就是解锁
// m.Unlock()
}
func read() int {
m.Lock()
a := v1
m.Unlock()
return a
}
func main() {
fmt.Println("开始测试锁的作用")
// 协程等待标志组
var wg sync.WaitGroup
for i := 0; i < 10; i++ {
// 每次开启一个协程前,就告诉等待组加一
wg.Add(1)
go func(i int) {
// 每个协程处理前,都defer后置处理,告诉等待组减一
defer wg.Done()
change(i)
res := read()
fmt.Println("处理后,当前获取到的值", i, "是", res)
}(i)
}
// 协助等待标志组会在组内数量为0后,结束等待,确保所有协程执行完成
wg.Wait()
}