参考答案
结论:多个写协程并发向同一个channel写数据,写入顺序不保证有序;channel本身不提供跨协程的写入顺序保证。
要点:
- Go channel的发送操作是原子且互斥的,但哪个协程先获得发送机会由调度器决定;
- 协程调度是随机的,因此先启动的协程不一定先写成功;
- 若需要有序,应由单一写协程负责写入,其他协程通过另channel发数据给该写协程;或使用互斥锁保护外部顺序逻辑。
示例:go f1写1,go f2写2,可能收到2然后1。原理:channel是先进先出队列,但仅针对已发送的元素,发送时机不确定。