单纯地将函数并发没有意义,函数与函数之间需要数据交换。
共享内存可以进行数据交换,但是在不同的协程里面容易发生竞态问题,为了保证数据交换的正确性,很多数据交换的正确性,很多并发模型中必须使用互斥量对内存需要加锁,这样会造成性能下降。
Golang提倡通信共享内存而不是通过共享内存而实现通信。
通道有两个操作,接收和发送,发送是发送值到通道,接收是从通道里面接收值。
通道panic的三种情况 :关闭已经关闭的通道、对关闭过的通道再发送值、关闭一个值为nil的通道。
无缓冲通道只有在接收方能够能够接收值的时候才能发送,否则一直处于等待发送的阶段。
无缓冲通道只有在发送方能够能够发送值的时候才能接收,否则一直处于等待接收的阶段。
以上两种情况都会可能会导致死锁。
channel 主要是由环形队列、等待队列、锁组成等
环形队列:作为缓冲区
等待队列:被阻塞的goroutine 将会挂在channel的等待队列(等待写消息队列和等待读消息队列)中
锁:主要是为了线程安全,在对数据进行入队列和出队列的时候,需要先获取互斥锁。
Channel死锁的场景:
无缓冲channel只读不写,或者是只写不读
多个协程互相等待
Channel的应用场景:
定时任务、解耦生产者消费者、控制并发数量、顺序