sync.Mutex用于保护共享资源,防止数据竞争;示例中多个goroutine通过加锁实现安全的计数器递增操作。

在Go语言中,sync包提供了多种并发同步工具,用于协调多个goroutine之间的执行。这些工具能有效避免竞态条件(race condition),确保共享资源的安全访问。下面介绍几种常用的sync工具及其使用示例。
sync.Mutex:互斥锁
当多个goroutine需要修改同一变量时,使用sync.Mutex可以防止数据竞争。
示例:多个goroutine对计数器进行递增操作:
package mainimport ( "fmt" "sync" "time")var ( counter = 0 mutex sync.Mutex)func increment(wg *sync.WaitGroup) { defer wg.Done() for i := 0; i < 1000; i++ { mutex.Lock() counter++ mutex.Unlock() }}func main() { var wg sync.WaitGroup for i := 0; i < 5; i++ { wg.Add(1) go increment(&wg) } wg.Wait() fmt.Println("最终计数器值:", counter) // 应为5000}
通过加锁保护counter变量,确保每次只有一个goroutine能修改它。
立即学习“go语言免费学习笔记(深入)”;
sync.RWMutex:读写锁
适用于读多写少的场景。RWMutex允许多个读操作同时进行,但写操作独占。
示例:缓存读写控制:
var ( data = make(map[string]int) rwMutex sync.RWMutex)func read(key string) int { rwMutex.RLock() defer rwMutex.RUnlock() return data[key]}func write(key string, value int) { rwMutex.Lock() defer rwMutex.Unlock() data[key] = value}
读操作用RLock,写操作用Lock,提高并发性能。
sync.WaitGroup:等待一组goroutine完成
WaitGroup用于主线程等待所有子goroutine执行完毕。
常见于批量任务处理:
func doTask(id int, wg *sync.WaitGroup) { defer wg.Done() fmt.Printf("任务 %d 完成n", id) time.Sleep(time.Second)}func main() { var wg sync.WaitGroup for i := 1; i <= 3; i++ { wg.Add(1) go doTask(i, &wg) } wg.Wait() fmt.Println("所有任务结束")}
每启动一个goroutine就Add(1),任务完成调用Done(),Wait()阻塞直到计数归零。
sync.Once:确保只执行一次
常用于单例初始化或配置加载,保证某段代码仅运行一次。
var ( configLoaded bool config string once sync.Once)func loadConfig() { once.Do(func() { fmt.Println("正在加载配置...") config = "loaded" configLoaded = true })}func main() { for i := 0; i < 3; i++ { go loadConfig() } time.Sleep(time.Second)}
尽管被多个goroutine调用,loadConfig中的初始化逻辑只会执行一次。
基本上就这些。合理使用sync工具能显著提升程序的并发安全性与效率。注意避免死锁,比如不要重复加锁或忘记解锁。调试时建议开启-race检测竞态条件。
以上就是Golang sync并发同步工具使用示例的详细内容,更多请关注创想鸟其它相关文章!
版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。
如发现本站有涉嫌抄袭侵权/违法违规的内容, 请发送邮件至 chuangxiangniao@163.com 举报,一经查实,本站将立刻删除。
发布者:程序猿,转转请注明出处:https://www.chuangxiangniao.com/p/1411105.html
微信扫一扫
支付宝扫一扫