筚路蓝缕,以启山林。抚有蛮夷,以属华夏。不鸣则已,一鸣惊人。 用代码说话: 控制台
——《左传`宣公十二年》
// 多个协程并发安全的操作共享变量:多个goroutine来操作变量,但在同一个时刻最多只有一个goroutine在操作共享变量。 // 背景设计:三个人共同抢票,抢完一次(只要还能抢到)还可继续抢,直到没票。 var tickets = 15 // 剩余15张票 var lock sync.Mutex var wait sync.WaitGroup var countA, countB, countC int func buyTickets(name string) bool { // 每个人抢完一次后我都要打印剩余票数,因此采用互斥锁。如果用读写锁则打印出来的票数会不正确(加锁时其他协程依旧可读) lock.Lock() defer lock.Unlock() if tickets <= 0 { return true } tickets-- if name == "A" { countA++ } if name == "B" { countB++ } if name == "C" { countC++ } fmt.Printf("%s 抢到一张票,剩余:%v 张. n", name, tickets) return false } func workM(w *sync.WaitGroup) { str := []string{"A", "B", "C"} for i := range str { go func(name string) { defer w.Done() for { if res := buyTickets(name); res { fmt.Println(name, ":没票了,结束。") break } r := rand.Intn(20) time.Sleep(time.Millisecond * time.Duration(r)) //模拟不同的人不同的网络延迟 } }(str[i]) } } func main() { wait.Add(3) workM(&wait) // 3个人抢票 wait.Wait() defer func() { fmt.Printf("抢票结束。A抢到%d个;B抢到%d个;C抢到%d个。n", countA, countB, countC) fmt.Println("当前运行的goroutine: ", runtime.NumGoroutine()) // 1,打印到这句时,除main外所有goroutine全部结束 }() }
C 抢到一张票,剩余:14 张. A 抢到一张票,剩余:13 张. B 抢到一张票,剩余:12 张. C 抢到一张票,剩余:11 张. B 抢到一张票,剩余:10 张. A 抢到一张票,剩余:9 张. B 抢到一张票,剩余:8 张. B 抢到一张票,剩余:7 张. B 抢到一张票,剩余:6 张. C 抢到一张票,剩余:5 张. C 抢到一张票,剩余:4 张. A 抢到一张票,剩余:3 张. B 抢到一张票,剩余:2 张. B 抢到一张票,剩余:1 张. C 抢到一张票,剩余:0 张. A :没票了,结束。 B :没票了,结束。 C :没票了,结束。 抢票结束。A抢到3个;B抢到7个;C抢到5个。 当前运行的goroutine: 1 Process finished with exit code 0
本网页所有视频内容由 imoviebox边看边下-网页视频下载, iurlBox网页地址收藏管理器 下载并得到。
ImovieBox网页视频下载器 下载地址: ImovieBox网页视频下载器-最新版本下载
本文章由: imapbox邮箱云存储,邮箱网盘,ImageBox 图片批量下载器,网页图片批量下载专家,网页图片批量下载器,获取到文章图片,imoviebox网页视频批量下载器,下载视频内容,为您提供.
阅读和此文章类似的: 全球云计算