美文网首页
【Golang】通道channel

【Golang】通道channel

作者: 冉小妹Ran | 来源:发表于2020-03-23 15:52 被阅读0次

    Java的并发:基于线程
    Golang的并发:基于协程goroutine

    并发会导致资源竞争:加锁
    防止资源竞争的三种方式:

    1. 原子函数:atomic.LoadInt32,atomic.StoreInt32
    2. 互斥锁:mutex sync.Mutex, mutex.Lock(), mutex.Unlock()
    3. 通道:channel

    通道Channel

    声明

    使用chan声明通道,并指明需要发送和接收的数据类型。例如:

    ch := make(chan int) 
    

    声明通道可以有第二个参数,用来指定通道大小。

    ch := make(chan int)      
    ch := make(chan int, 0)
    ch := make(chan int, 2)
    

    第一种和第二种等价,都为无缓冲通道。第三种为有缓冲通道,容量为2。

    发送和接收

    使用操作符 -> 进行发送和接收

    ch <- 2    //发送数值2给这个通道
    x: = <-ch  //从通道里读取值,并把读取的值赋值给x变量
    <- ch      //从通道里读取值,然后忽略
    

    关闭

    当通道关闭时,就不能再往通道发送数据了,但是可以从通道接收数据。

    close(ch)
    

    通道缓冲

    1. 无缓冲通道
      无缓冲通道,如果发送和接收有一方还没有准备好的话,先执行的一方会阻塞直到另一方操作结束。无缓冲通道也称为同步通道
    2. 有缓冲通道
      有缓冲通道类似于队列。发送操作即向队列的尾部插入一条数据。接收操作类似删除队列头部数据,并返回删除的这条数据。

    单向通道

    var send chan<- int    //只能发送
    var receive <-chan int //只能接收
    

    相关文章

      网友评论

          本文标题:【Golang】通道channel

          本文链接:https://www.haomeiwen.com/subject/veywyhtx.html