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

posted @   人艰不拆_zmc  阅读(355)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 阿里最新开源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(无向连通图求割边)
点击右上角即可分享
微信分享提示