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

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

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

参考

原文地址:

转载地址:http://xmxto.baihongyu.com/

你可能感兴趣的文章
php函数nl2br的反函数br2nl 将html中的br换行符转换为文本输入中的换行符
查看>>
leaflet入门(二)GeoJson
查看>>
HDU Problem 5631 Rikka with Graph【并查集】
查看>>
找到多个与名为“Home”的控制器匹配的类型。解决方法
查看>>
使用openvswitch实现跨主机docker容器互联
查看>>
swift 移除控制器中的已经存在的VC 注意
查看>>
c++——const
查看>>
古老的加密技术
查看>>
自学两周,轻松利用C语言实现黑客数码雨(内附源码)
查看>>
iOS 13 上手体验
查看>>
个人笔记
查看>>
【题解】 CF949C Data Center Maintenance
查看>>
【第四期】基于 @vue/cli3 插件,集成日志系统【SSR第三篇】
查看>>
命令类型即使用帮助
查看>>
struts2中不能使用static关键字作为URL路径
查看>>
SQL Sever 学习系列之三
查看>>
Cannot determine embedded database driver class for database type NONE
查看>>
解决Unknown error: Unable to build: the file dx.jar was not loaded from the SDK folder!
查看>>
iOS多线程-NSThread
查看>>
linux安装sphinx
查看>>