同步概况
同步是并发最后一个环节。
当两个并发单元共享同一个数据的时候需要同步处理。这里的并发单元不限于进程中的两个线程,也可能两个进程,甚至两台服务器。同步处理不局限共享同一块内存,当两个进程共享同一个文件给文件加锁都是同步处理,在数据库中启动一个事务或者启动乐观锁都是同步处理。共享同一资源产生数据竞争都需要做同步处理。
标准库 sync
包专门用来做同步的,它由条件、锁,锁分为互斥和读写,WaitGroup 等组件构成。任何一种语言的同步组件使用频率非常高,性能要求非常苛刻,设计上都会非常精巧。平时写业务代码只是为了完成逻辑,但是像同步这种偏系统型的代码实现有很多很精巧的设计,我们去设计粒度会更粗糙不会有这么精巧。所以对于同步代码阅读和学习有助于开阔对代码控制能力的眼光。
不同的同步方式
在不同场景选择合适的同步方式。
- channel:存在生产、消费等不同角色。
- mutex:相同角色间的逻辑竞争保护。
- atomic:单数据。
通常情况下同步使用官方提供的标准方案,不使用系统层面做同步,因为系统层面有系统调用的问题。在运行时层面包装也有很多的限制。我们使用 goroutine 模型标准做法倾向官方提供的一些解决方案。因为官方提供的解决方案和运行时协调始终会保证向下兼容。所以一般建议不要使用第三方框架做同步,因为多数情况下的性能问题是架构