教程集 www.jiaochengji.com
教程集 >  Golang编程  >  golang教程  >  正文 Go 标准库 —— sync.Mutex 互斥锁

Go 标准库 —— sync.Mutex 互斥锁

发布时间:2022-03-17   编辑:jiaochengji.com
教程集为您提供Go 标准库 —— sync.Mutex 互斥锁等资源,欢迎您收藏本站,我们将为您提供最新的Go 标准库 —— sync.Mutex 互斥锁资源
<blockquote>Mutex 是一个互斥锁,可以创建为其他结构体的字段;零值为解锁状态。Mutex 类型的锁和线程无关,可以由不同的线程加锁和解锁。</blockquote> <h2>方法</h2> <h3>func (*Mutex) Lock</h3> <pre><code>func (m *Mutex) Lock()</code></pre>

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

<h3>func (*Mutex) Unlock</h3> <pre><code>func (m *Mutex) Unlock()</code></pre>

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

<h2>注意</h2> <ul><li>在一个 goroutine 获得 Mutex 后,其他 goroutine 只能等到这个 goroutine 释放该 Mutex</li> <li>使用 Lock() 加锁后,不能再继续对其加锁,直到利用 Unlock() 解锁后才能再加锁</li> <li>在 Lock() 之前使用 Unlock() 会导致 panic 异常</li> <li>已经锁定的 Mutex 并不与特定的 goroutine 相关联,这样可以利用一个 goroutine 对其加锁,再利用其他 goroutine 对其解锁</li> <li>在同一个 goroutine 中的 Mutex 解锁之前再次进行加锁,会导致死锁</li> <li>适用于读写不确定,并且只有一个读或者写的场景</li> </ul><h2>实例</h2> <pre><code>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() }</code></pre>

运行结果:

<pre><code>Locked Not lock: 1 Not lock: 2 Not lock: 3 Unlocked Lock: 1 Unlock: 1 Lock: 2 Unlock: 2 Lock: 3 Unlock: 3</code></pre> <h2>参考</h2> <ul><li>标准库文档 —— sync.Mutex</li> <li>golang 中 sync.Mutex 和 sync.RWMutex</li> </ul><blockquote>原文地址: https://shockerli.net/post/go...
更多文章请访问我的个人博客: https://shockerli.net </blockquote> 到此这篇关于“Go 标准库 —— sync.Mutex 互斥锁”的文章就介绍到这了,更多文章或继续浏览下面的相关文章,希望大家以后多多支持JQ教程网!

您可能感兴趣的文章:
Go 标准库 —— sync.Mutex 互斥锁
Go语言并发编程2 - 同步
Golang 并发编程与同步原语
常见的导致mysql中文乱码问题
golang学习笔记(二)—— 深入golang中的协程
更改MySQL数据库名实例代码
Go并发编程之传统同步—(2)条件变量
专家教你如何有效的学习Drupal - Drupal问答
mysql中文乱码问题解决方法总结
聊聊并发,进程通信方式,go协程简单应用场景

[关闭]
~ ~