Golang_互斥锁
程序员文章站
2022-05-06 19:15:23
为什么需要锁? 在并发的情况下,多个线程或协程同时去修改一个变量。使用锁能保证在某一时间点内,只有一个协程或线程修改这一变量。 锁的概念就是,我正在处理 a(锁定),你们等着,等我处理完了(解锁),你们再处理。这样就实现了,同时处理 a 的协程只有一个,就实现了同步。 GO语言标准库文档 sync包 ......
为什么需要锁?
在并发的情况下,多个线程或协程同时去修改一个变量。使用锁能保证在某一时间点内,只有一个协程或线程修改这一变量。
锁的概念就是,我正在处理 a(锁定),你们等着,等我处理完了(解锁),你们再处理。这样就实现了,同时处理 a 的协程只有一个,就实现了同步。
go语言标准库文档
sync包提供了基本的同步基元,如互斥锁,读写锁。读写锁基于互斥锁实现的。
type mutex struct { // 包含隐藏或非导出字段 }
mutex是一个互斥锁,可以创建为其他结构体的字段;零值为解锁状态。mutex类型的锁和线程无关,可以由不同的线程加锁和解锁。
互斥锁提供两个api,lock(加锁)和unlock(释放锁)。
func (m *mutex) lock()
func (m *mutex) unlock()
lock方法锁住m,如果m已经加锁,则阻塞直到m解锁。
unlock方法解锁m,如果m未加锁会导致运行时错误。锁和线程无关,可以由不同的线程加锁和解锁。
使用go语言的lock锁一般不会出现忘了解锁的情况,因为其紧跟锁定的就是defer unlock 。 需要注意的是一个互斥锁只能同时被一个 goroutine 锁定,其它 goroutine 将阻塞直到互斥锁被解锁(重新争抢对互斥锁的锁定)。
上一篇: python正则表达式入门篇