golang互斥锁mutex简单实例
模拟4个售票口同时售卖10张票,使用互斥锁解决数据竞争
package main
import (
"fmt"
"sync"
"time"
)
//声明等待组变量
var wg sync.WaitGroup
//声明互斥锁
var mutex sync.Mutex
//声明票数
var ticket=10
func main() {
//4个goroutine,模拟4个售票口
wg.Add(4)
go saleTickets("售票口1")
go saleTickets("售票口2")
go saleTickets("售票口3")
go saleTickets("售票口4")
wg.Wait()
}
func saleTickets(name string) {
defer wg.Done()
for{
mutex.Lock()
if ticket>0{
time.Sleep(time.Second)
fmt.Println(name,"售出:",ticket)
ticket--
}else {
mutex.Unlock()
fmt.Println(name,"售完,没有票了。。。")
break
}
mutex.Unlock()
}
}
输出
售票口1 售出: 10
售票口1 售出: 9
售票口4 售出: 8
售票口2 售出: 7
售票口3 售出: 6
售票口1 售出: 5
售票口4 售出: 4
售票口2 售出: 3
售票口3 售出: 2
售票口1 售出: 1
售票口4 售完,没有票了。。。
售票口3 售完,没有票了。。。
售票口2 售完,没有票了。。。
售票口1 售完,没有票了。。。