go语言学习-通道
- 通道
- 除了原子函数和互斥锁外,通道也能保证对共享资源的安全访问以及消除竞争状态,通道通过发送和接收需要共享的资源,在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试图同时访问同一个资源
- 原子函数和互斥锁可以防止竞争状态
相关文章