欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页  >  IT编程

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 将阻塞直到互斥锁被解锁(重新争抢对互斥锁的锁定)。