Golang 并发
极客时间《Go 语言从入门到实践》学习笔记 07
24 | 共享内存并发机制
视频中的代码和课件上的不太一样
主要的差别实在 wg.Done() 的位置,简单测试了一下,两种方法的输出结果都是对的。
按照老师在留言中的回复,wg.Done() 和 wg.Add(1) 应该是对应的,那么视频中的写法应该更符合本意。
老师在视频最后的补充说明:
WaitGroup 相当于 Java 中的 Join
Mutex 和 RW lock 都是共享内存机制,尽量使用 RW lock
两个读锁不是互斥锁,共享内存
两个写锁是互斥锁
25 | CSP 并发机制
channel:交互的两方都必须在 Channel 两端才能通信,否则就会阻塞。
buffer channel:消息的发送者和接收者松耦合,Channel 可以有一个容量。如果容量满了,发送方等待;如果容量是空的,那么接收方等待。
有一点好奇,channel 的应用场景是否要少一些?
老师从这一讲开始已经不再现场写代码,而是直接对着代码来讲么?
之前的负面评论者已经消失了。
26 | 多路选择和超时控制
select 多路选择和其他语言中的 switch 比较像( Go 语言中似乎没有 Switch ?),但是从执行顺序(随机选择)和 default 的用法来说有很大的差别。
select 很像 switch,每个 Case 后面跟的是阻塞事件,从 channel 上等待消息。
执行到 select 的时候,只要任何 case 后面的任何一个等待渠道,阻塞事件处于非阻塞状态,就是 channel 中有一个消息,那么就会执行后续的代码
但是不能依赖 case 的顺序。
一定要看留言中的回复。
在 @Van 的留言里面,select 会不等到超时就执行 default 子句,very tricky。
如果有多个 case 都可以运行,Select 会随机公平地选出一个执行。其他不会执行。否则,如果有 default 子句,则执行该语句;如果没有 default 子句,select 将阻塞,直到某个通信可以运行;
版权声明: 本文为 InfoQ 作者【escray】的原创文章。
原文链接:【http://xie.infoq.cn/article/7586dae835c114f1fc3b3044d】。
本文遵守【CC-BY 4.0】协议,转载请保留原文出处及本版权声明。
评论