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

在Go语言中,并没有传统意义上的“线程”,而是使用goroutine来实现并发。多个goroutine访问共享资源时,可能会出现数据竞争问题。为了保证对共享资源的安全访问,可以使用sync.Mutex(互斥锁)来实现同步控制。
什么是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能修改该变量。
BJXShop网上购物系统是一个高效、稳定、安全的电子商店销售平台,经过近三年市场的考验,在中国网购系统中属领先水平;完善的订单管理、销售统计系统;网站模版可DIY、亦可导入导出;会员、商品种类和价格均实现无限等级;管理员权限可细分;整合了多种在线支付接口;强有力搜索引擎支持... 程序更新:此版本是伴江行官方商业版程序,已经终止销售,现于免费给大家使用。比其以前的免费版功能增加了:1,整合了论坛
常见使用技巧与注意事项
实际开发中,合理使用Mutex能提升程序稳定性:
- 避免长时间持有锁:加锁后应尽快完成操作并解锁,不要在锁内执行耗时I/O或阻塞调用。
- 配合
defer使用:推荐用defer mutex.Unlock()确保即使发生panic也能释放锁。 - 嵌入结构体中:常将Mutex作为字段嵌入到需要保护的结构体中。
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
}
这种方式封装了并发安全的访问逻辑,外部无需关心锁的管理。
读写锁(RWMutex)的适用场景
如果共享资源主要是读操作,偶尔写入,使用sync.RWMutex更高效:
-
RLock()/RUnlock():允许多个读操作同时进行。 -
Lock()/Unlock():写操作独占访问。
适用于读多写少的场景,如配置缓存、状态监控等。
基本上就这些。只要在访问共享资源前加锁、完成后解锁,就能有效保障goroutine间的操作安全。









