go语言学习-通道

2020-07-09 00:00:00 发送 缓冲 接收 类型 通道

  • 通道
    • 除了原子函数和互斥锁外,通道也能保证对共享资源的安全访问以及消除竞争状态,通道通过发送和接收需要共享的资源,在goroutine之间做到资源同步。
    • 声明通道时,需要指定将要被共享的数据的类型
    • 可以通过通道共享内置类型、命名类型、结构类型和引用类型的值或者指针
    • 通道需要通过内置函数make()来创建通道。
      • chan := make(chan int)----------无缓冲通道
      • buffer := make(chan string,10)---------有缓冲通道
      • 创建通道需要使make函数的个参数是关键字“chan”,之后跟着允许通道交换的数据类型,如果创建的是有缓冲通道,还需要第二个参数指定该通道的缓冲区大小
      • 通过通道发送值或指针需要用到“<-”操作符

buffer <- "abcd"

  • goroutine从通道获取数据

value := <-buffer

  • 无缓冲通道
    • 无缓冲通道是指在接收前没有能力保存任何值的通道,这种通道需要发送goroutine和接收goroutine同时准备好,才能完成发送和接收操作。
    • 如果发送goroutine和接收goroutine没有同时准备好,会造成发送或接收操作的goroutine阻塞等待。
  • 有缓冲通道
    • 有缓冲通道是一种在被接收前能存储一个或者多个值的通道。不强制要求goroutine之间必须同时完成发送和接受。
    • 通道中没有要接收的值时,接收动作会阻塞。
    • 通道没有可用的缓冲区容纳被发送的值时,发送动作会阻塞。
    • 无缓冲通道能保证发送和接受会在同一时间进行数据交换,有缓冲通道没有这种保证。
  • 总结:
    • 并发是指goroutine之间相互独立的运行
    • goroutine在逻辑处理器上执行,逻辑处理器具有独立的系统线程和运行队列
    • 竞争状态是指两个或多个goroutine试图同时访问同一个资源
    • 原子函数和互斥锁可以防止竞争状态

相关文章