Go sync包:并发同步模式
学习使用sync包中的Mutex、WaitGroup、Once和Cond进行并发控制与同步。 · 难度:入门 · +15XP
Go sync包概述
Go的sync包提供了基本的同步原语,用于在多个goroutine之间安全地共享数据。最常用的包括:
| 类型 | 用途 |
|---|---|
| Mutex | 互斥锁,保护共享资源 |
| RWMutex | 读写锁,读多写少时性能更优 |
| WaitGroup | 等待一组goroutine完成 |
| Once | 只执行一次的操作(如初始化) |
| Cond | 条件变量,用于goroutine间的信号通知 |
使用Mutex时,务必调用Lock/Unlock配对,推荐使用defer。WaitGroup通过Add/Done/Wait协作,Once确保函数仅执行一次。
代码示例:Mutex保护计数器
package main
import (
"fmt"
"sync"
)
type Counter struct {
mu sync.Mutex
value int
}
func (c *Counter) Increment() {
c.mu.Lock()
c.value++
c.mu.Unlock()
}
func (c *Counter) Value() int {
c.mu.Lock()
defer c.mu.Unlock()
return c.value
}
func main() {
var wg sync.WaitGroup
counter := Counter{}
for i := 0; i < 1000; i++ {
wg.Add(1)
go func() {
defer wg.Done()
counter.Increment()
}()
}
wg.Wait()
fmt.Println("Final count:", counter.Value())
}
练习提示
尝试将Mutex替换为RWMutex,并添加多个读goroutine观察性能变化。注意:RWMutex在写锁时阻塞所有读写,读锁时只阻塞写。