1. 互斥锁用于在代码上创建一个临界区, 保证同一时间只有一个 goroutine 可以执行这个临界区代码
2.Lock() 和 Unlock() 定义临界区
- package main
- import (
- "fmt"
- "runtime"
- "sync"
- )
- var (
- // 全局变量
- counter int64
- // 计数信号量
- wg sync.WaitGroup
- //mutex 定义一段代码临界区
- mutex sync.Mutex
- )
- func main() {
- fmt.Println("hello")
- // 计数加 2, 等待两个 goroutine
- wg.Add(2)
- go incCounter()
- go incCounter()
- // 主 goroutine 等待子 goroutine 结束
- wg.Wait()
- fmt.Println("最终 counter 值:", counter)
- }
- // 增加 counter 的值函数
- func incCounter() {
- // 函数结束, 减小信号量
- defer wg.Done()
- for count := 0; count < 2; count++ {
- // 创建这个临界区
- // 同一时刻只允许一个 goroutine 进入
- mutex.Lock()
- // 使用大括号只是为了让临界区看起来更清晰, 并不是必须的
- {
- value := counter
- // 强制调度器切换
- runtime.Gosched()
- value++
- counter = value
- }
- mutex.Unlock()
- }
- }
[Go] golang 互斥锁 mutex
来源: http://www.bubuko.com/infodetail-2956135.html