sync
Golang 标准库 - sync
sync 包提供了基本的同步原语,如互斥锁。除了 Once 和 WaitGroup 类型外,大多数类型都是为低级库例程设计的。更高级的同步应优先通过 channel 和通信来完成。
主要功能说明:
-
Mutex(互斥锁):
Lock()加锁Unlock()解锁- 保护临界区
-
RWMutex(读写锁):
RLock()/RUnlock()读锁Lock()/Unlock()写锁- 允许多个读或单个写
-
WaitGroup:
Add()添加计数Done()完成计数Wait()等待完成
-
Once:
Do()只执行一次- 用于单例初始化
-
Map:
- 并发安全的 map
Store/Load/Delete操作
func main() {
// 1. Mutex 互斥锁
fmt.Println("=== Mutex 互斥锁 ===")
var mu sync.Mutex
counter := 0
var wg sync.WaitGroup
for i := 0; i < 100; i++ {
wg.Add(1)
go func() {
defer wg.Done()
mu.Lock()
counter++
mu.Unlock()
}()
}
wg.Wait()
fmt.Println("Counter:", counter) // 100
// 2. RWMutex 读写锁
fmt.Println("\n=== RWMutex 读写锁 ===")
var rwmu sync.RWMutex
data := make(map[string]int)
// 写操作
go func() {
rwmu.Lock()
data["key"] = 42
rwmu.Unlock()
}()
// 读操作
go func() {
rwmu.RLock()
value := data["key"]
rwmu.RUnlock()
fmt.Println("Read value:", value)
}()
time.Sleep(100 * time.Millisecond)
// 3. Once 只执行一次
fmt.Println("\n=== Once 只执行一次 ===")
var once sync.Once
for i := 0; i < 5; i++ {
once.Do(func() {
fmt.Println("This will only print once")
})
}
// 4. Sync Map
fmt.Println("\n=== Sync Map ===")
var sm sync.Map
// 存储
sm.Store("name", "Alice")
sm.Store("age", 30)
// 读取
if value, ok := sm.Load("name"); ok {
fmt.Println("name:", value)
}
// 遍历
sm.Range(func(key, value interface{}) bool {
fmt.Printf("%v: %v\n", key, value)
return true
})
}