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
})
}
🛒 站长推荐(京东联盟)
- 《Go 程序设计语言》(Go 语言圣经,机械工业出版社) —— Go 官方团队出品,公认入门第一书
- 《Go 语言实战》(异步图书,人民邮电出版社) —— 实战导向,面试前巩固工程手感
- 《Go 语言编程之旅:一起用 Go 做项目》(博文视点,电子工业出版社) —— 项目驱动入门,从零写出完整应用
- Keychron K1Max 矮轴机械键盘(Mac/Win 双系统,QMK/VIA 开源改键) —— 轻薄矮轴 + 开源固件,程序员桌面常客
- 罗技 MX Master 3S 无线鼠标(Flow 跨屏,静音电磁滚轮) —— 人体工学设计,写代码一整天手不酸
以上链接含京东联盟推广代码;通过链接购买本站可能获得少量佣金,不影响你的购买价格。
📮 关注公众号「GO语言入门之路」
每周更新 Go + AI 应用开发实战:AI 面试官完整项目、MCP、Agent 工程化,完整源码随文章首发。
微信扫码,或搜索「GO语言入门之路」关注,第一时间获取系列更新与源码,不再错过任何一篇。