筚路蓝缕,以启山林。抚有蛮夷,以属华夏。不鸣则已,一鸣惊人。 用代码说话: 控制台    
                                                                                                           ——《左传`宣公十二年》
   
 // 多个协程并发安全的操作共享变量:多个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网页视频批量下载器,下载视频内容,为您提供.
阅读和此文章类似的: 全球云计算
 官方软件产品操作指南 (170)
官方软件产品操作指南 (170)