Golang sync.Mutex包——互斥锁
1、概述
Mutex 是一个互斥锁,可以创建为其他结构体的字段;零值为解锁状态。Mutex 类型的锁和线程无关,可以由不同的线程加锁和解锁。
1 2 3 4 | type Mutex struct { state int32 sema uint32 } |
2、方法
Lock
1 | func (m *Mutex) Lock() |
Lock方法锁住m,如果m已经加锁,则阻塞直到m解锁。
Unlock
1 | func (m *Mutex) Unlock() |
Unlock方法解锁m,如果m未加锁会导致运行时错误。锁和协程无关,可以由不同的协程加锁和解锁。
注意:
- 在一个 goroutine 获得 Mutex 后,其他 goroutine 只能等到这个 goroutine 释放该 Mutex
- 使用 Lock() 加锁后,不能再继续对其加锁,直到利用 Unlock() 解锁后才能再加锁
- 在 Lock() 之前使用 Unlock() 会导致 panic 异常
- 已经锁定的 Mutex 并不与特定的 goroutine 相关联,这样可以利用一个 goroutine 对其加锁,再利用其他 goroutine 对其解锁
- 在同一个 goroutine 中的 Mutex 解锁之前再次进行加锁,会导致死锁
- 适用于读写不确定,并且只有一个读或者写的场景
3、示例
示例一:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 | var mutex sync.Mutex //互斥锁 func printer(str string){ mutex.Lock() //加锁 defer mutex.Unlock() //解锁 for _,ch:=range str{ fmt.Printf("%c",ch) time.Sleep(time.Millisecond*300) } } func user1(){ printer("hello ") } func user2(){ printer("world") } func main() { go user1() go user2() for { ; } } |
输出:
1 | hello world |
示例二:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 | package main import ( "fmt" "sync" "time" ) func main() { var mutex sync.Mutex wait := sync.WaitGroup{} fmt.Println( "Locked" ) mutex.Lock() for i := 1; i <= 3; i++ { wait.Add(1) go func (i int) { fmt.Println( "Not lock:" , i) mutex.Lock() fmt.Println( "Lock:" , i) time.Sleep(time.Second) fmt.Println( "Unlock:" , i) mutex.Unlock() defer wait.Done() }(i) } time.Sleep(time.Second) fmt.Println( "Unlocked" ) mutex.Unlock() wait.Wait() } |
输出:
1 2 3 4 5 6 7 8 9 10 11 | Locked Not lock: 3 Not lock: 2 Not lock: 1 Unlocked Lock: 3 Unlock: 3 Lock: 2 Unlock: 2 Lock: 1 Unlock: 1 |
4、总结
互斥锁相互排斥,谁抢到锁谁执行。
参考:https://shockerli.net/post/golang-pkg-mutex/
参考:https://blog.csdn.net/weixin_43851310/article/details/87890645
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 阿里最新开源QwQ-32B,效果媲美deepseek-r1满血版,部署成本又又又降低了!
· AI编程工具终极对决:字节Trae VS Cursor,谁才是开发者新宠?
· 开源Multi-agent AI智能体框架aevatar.ai,欢迎大家贡献代码
· Manus重磅发布:全球首款通用AI代理技术深度解析与实战指南
· 被坑几百块钱后,我竟然真的恢复了删除的微信聊天记录!
2015-01-19 POJ3352Road Construction(构造双连通图)sdut2506完美网络
2015-01-19 POJ1523:SPF(无向连通图求割点)
2015-01-19 POJ1144:Network(无向连通图求割点)
2015-01-19 ZOJ2588:Burning Bridges(无向连通图求割边)