Content #
一般情况下,优先使用 CSP 并发模型进行并发程序设计。但是在下面一些场景中,我们依然需要 sync 包提供的低级同步原语。
- 需要高性能的临界区(critical section)同步机制场景。
在 Go 中,channel 并发原语也可以用于对数据对象访问的同步,我们可以把 channel 看成是一种高级的同步原语,它自身的实现也是建构在低级同步原语之上的。也正因为如此,channel 自身的性能与低级同步原语相比要略微逊色,开销要更大。
- 在不想转移结构体对象所有权,但又要保证结构体内部状态数据的同步访问的场景。
基于 channel 的并发设计,有一个特点:在 Goroutine 间通过 channel 转移数据对象的所有权。所以,只有拥有数据对象所有权(从 channel 接收到该数据)的 Goroutine 才可以对该数据对象进行状态变更。
如果你的设计中没有转移结构体对象所有权,但又要保证结构体内部状态数据在多个 Goroutine 之间同步访问,那么你可以使用 sync 包提供的低级同步原语来实现,比如最常用的sync.Mutex。