Mutex是互斥锁,用于保护共享资源不被多个goroutine同时访问。Go中通过sync.Mutex的Lock()和Unlock()方法实现加锁与解锁,确保同一时间只有一个goroutine能访问临界区,从而避免数据竞争。示例中多个goroutine并发递增共享计数器时,使用Mutex可保证操作的原子性,防止竞态条件。

在Go语言中,并没有传统意义上的“线程”,而是使用goroutine来实现并发。多个goroutine访问共享资源时,可能会出现数据竞争问题。为了保证对共享资源的安全访问,可以使用sync.Mutex(互斥锁)来实现同步控制。
Mutex是“Mutual Exclusion”的缩写,用于保护共享资源不被多个goroutine同时访问。在Go中,sync.Mutex提供了两个主要方法:
Lock():获取锁,如果已被其他goroutine持有,则阻塞等待。Unlock():释放锁,必须由持有锁的goroutine调用。正确使用Mutex能有效防止竞态条件(race condition),确保同一时间只有一个goroutine能进入临界区。
下面是一个使用Mutex保护共享变量的简单例子:
立即学习“go语言免费学习笔记(深入)”;
package main
import (
"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的递增都包裹在Lock()和Unlock()之间,确保任意时刻只有一个goroutine能修改该变量。
实际开发中,合理使用Mutex能提升程序稳定性:
defer使用:推荐用defer mutex.Unlock()确保即使发生panic也能释放锁。
type SafeCounter struct {
mu sync.Mutex
count int
}
func (sc *SafeCounter) Inc() {
sc.mu.Lock()
defer sc.mu.Unlock()
sc.count++
}
func (sc *SafeCounter) Value() int {
sc.mu.Lock()
defer sc.mu.Unlock()
return sc.count
}
这种方式封装了并发安全的访问逻辑,外部无需关心锁的管理。
如果共享资源主要是读操作,偶尔写入,使用sync.RWMutex更高效:
RLock()/RUnlock():允许多个读操作同时进行。Lock()/Unlock():写操作独占访问。适用于读多写少的场景,如配置缓存、状态监控等。
基本上就这些。只要在访问共享资源前加锁、完成后解锁,就能有效保障goroutine间的操作安全。以上就是Golang如何使用mutex实现线程安全的详细内容,更多请关注php中文网其它相关文章!
每个人都需要一台速度更快、更稳定的 PC。随着时间的推移,垃圾文件、旧注册表数据和不必要的后台进程会占用资源并降低性能。幸运的是,许多工具可以让 Windows 保持平稳运行。
Copyright 2014-2025 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号