Go 的并发模式(中)(更新中)

  • 有几种情况都会发生堵塞,一旦发生堵塞就会造成锁死

  • 第一种情况只有发送没有接受,就会造成 blocking

ch := make(chan int)
    ch <- 1
  • 第二种情况没有发送只有接受,就会造成 blocking
ch := make(chan int, 3)
fmt.Println("",<-ch)
  • buffered channel 一旦满了也会造成 blocking 的问题
    ch := make(chan int, 3)
    ch <-1
    ch <-2
    ch <-3
    

    fmt.Println("",<-ch)
    fmt.Println("",<-ch)
    fmt.Println("",<-ch)

  • 可以用 close 来关闭 channel,但这并不是最好解决方案
    ch := make(chan int, 3)
    ch <-1
    ch <-2
    ch <-3
    
    close(ch)
    fmt.Println("",<-ch)
    fmt.Println("",<-ch)
    fmt.Println("",<-ch)
    fmt.Println("",<-ch)
    fmt.Println("",<-ch)

大家发现当关闭channel后重,动态获取值为 0

 1
 2
 3
 0
 0

当调用 close 来关闭通道后,我们再从 channel 获取数据时候返回两个值
0 为 int类型默认值, false 表示该 channel 已经关闭。

val, ok := <-ch
   fmt.Println("",ok)
   fmt.Println("",val)

    false
 0
    原文作者:zidea
    原文地址: https://www.jianshu.com/p/f399a43b83ac
    本文转自网络文章,转载此文章仅为分享知识,如有侵权,请联系博主进行删除。
点赞