⚡ 编程实验室🏗️ HTML🎨 CSS⚡ JavaScript🐍 Python🗄️ SQL☕ Java⚛️ React💚 Vue🟢 Node.js⚙️ C语言🐘 PHP🐹 Go🔷 TypeScript🐬 MySQL🔧 C++🎯 C#🦀 Rust🅱️ Bootstrap💡 jQuery🎸 Django🍃 MongoDB👗 Sass🎪 Kotlin📊 R语言📋 XML📊 Excel🐘 PostgreSQL🐳 Docker🅰️ Angular🎮 游戏🏠 网站首页

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在写锁时阻塞所有读写,读锁时只阻塞写。

Ctrl+Enter
🚀 升级VIP
解锁全部课程+AI助手

🏆 学习排行

加载中...

📊 统计

📖 142 篇
0 完成
🔥 0