Mutex用于解决多goroutine并发访问共享资源时的数据竞争问题,通过Lock和Unlock确保同一时间只有一个goroutine能访问临界区,示例中使用defer保证解锁,实现计数器安全递增。

在Go语言中,Mutex(互斥锁)用于保护共享资源,防止多个goroutine同时访问造成数据竞争。当多个goroutine并发读写同一变量时,使用 sync.Mutex 能确保在同一时刻只有一个goroutine可以进入临界区。
Go的并发模型基于goroutine和channel,但当多个goroutine操作同一个变量时,比如对一个map或计数器进行写操作,不加保护会导致竞态条件(race condition)。例如:
两个goroutine同时对一个全局变量i执行i++,可能最终结果只加了1,而不是2。这时就需要使用 sync.Mutex 来保证操作的原子性。
使用 sync.Mutex 的基本方式是:在访问共享资源前调用 Lock(),操作完成后立即调用 Unlock()。通常配合 defer 使用,确保解锁不会被遗漏。
立即学习“go语言免费学习笔记(深入)”;
示例:安全地增加计数器
package main
import (
"fmt"
"sync"
)
var (
counter = 0
mutex sync.Mutex
)
func increment(wg *sync.WaitGroup) {
defer wg.Done()
mutex.Lock()
defer mutex.Unlock()
counter++
}
func main() {
var wg sync.WaitGroup
for i := 0; i < 1000; i++ {
wg.Add(1)
go increment(&wg)
}
wg.Wait()
fmt.Println("Final counter:", counter) // 输出: 1000
}
在这个例子中,每次对 counter 的修改都由 mutex 保护,避免了数据竞争。
sync.RWMutex 可提升性能,允许多个读操作并发执行。defer mutex.Unlock()。在多goroutine环境中,只要存在对共享变量的写操作,就必须使用Mutex进行同步。正确使用 sync.Mutex 能有效防止数据竞争,保障程序正确性。关键是:先Lock,操作完Unlock,并优先使用defer来释放锁。
基本上就这些,不复杂但容易忽略细节。
以上就是Golang如何在多goroutine中使用Mutex的详细内容,更多请关注php中文网其它相关文章!
每个人都需要一台速度更快、更稳定的 PC。随着时间的推移,垃圾文件、旧注册表数据和不必要的后台进程会占用资源并降低性能。幸运的是,许多工具可以让 Windows 保持平稳运行。
Copyright 2014-2025 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号