博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
Go 标准库 —— sync.Mutex 互斥锁
阅读量:7101 次
发布时间:2019-06-28

本文共 1254 字,大约阅读时间需要 4 分钟。

Mutex 是一个互斥锁,可以创建为其他结构体的字段;零值为解锁状态。Mutex 类型的锁和线程无关,可以由不同的线程加锁和解锁。

方法

func (*Mutex) Lock

func (m *Mutex) Lock()

Lock 方法锁住 m,如果 m 已经加锁,则阻塞直到 m 解锁。

func (*Mutex) Unlock

func (m *Mutex) Unlock()

Unlock 方法解锁 m,如果 m 未加锁会导致运行时错误。

注意

  • 在一个 goroutine 获得 Mutex 后,其他 goroutine 只能等到这个 goroutine 释放该 Mutex
  • 使用 Lock() 加锁后,不能再继续对其加锁,直到利用 Unlock() 解锁后才能再加锁
  • 在 Lock() 之前使用 Unlock() 会导致 panic 异常
  • 已经锁定的 Mutex 并不与特定的 goroutine 相关联,这样可以利用一个 goroutine 对其加锁,再利用其他 goroutine 对其解锁
  • 在同一个 goroutine 中的 Mutex 解锁之前再次进行加锁,会导致死锁
  • 适用于读写不确定,并且只有一个读或者写的场景

实例

package mainimport (    "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()}

运行结果:

LockedNot lock: 1Not lock: 2Not lock: 3UnlockedLock: 1Unlock: 1Lock: 2Unlock: 2Lock: 3Unlock: 3

参考

个人博客同步地址:

转载于:https://www.cnblogs.com/shockerli/p/golang-pkg-mutex.html

你可能感兴趣的文章
Aix项目_shell_rsh_01
查看>>
HDU 5726 GCD 求给定序列中与查询段相等的GCD个数
查看>>
python实训第四天
查看>>
5-4-3原则
查看>>
html图像入门
查看>>
C# Mongo Client 2.4.2创建索引
查看>>
我的第四个网页制作:列表标签
查看>>
【python进阶】详解元类及其应用2
查看>>
简单实用的菜单栏
查看>>
AMap行政区查询服务
查看>>
SpringBoot2.0源码分析(一):SpringBoot简单分析
查看>>
Java,net上的几篇文章
查看>>
Chrome的Awesome Screenshot的插件离线下载
查看>>
改变self.navigationItem的显示标题
查看>>
Revit2014机电系统类型BUG
查看>>
函数指针
查看>>
数学图形之Boy surface
查看>>
Objective-C中把数组中字典中的数据转换成URL
查看>>
mysqld: unrecognized service
查看>>
Windows环境下利用github快速配置git环境
查看>>