一、为什么需要锁
举例:有一个变量4,有两个协程对这个变量执行+1操作。如果没有锁,那么这两个协程可能同时读,结果都是读到4去执行+1操作,最后的结果是5。
锁的作用:在并发的情况下,多个线程或协程同时去修改一个变量。使用锁能保证在某一时间点内,只有一个协程或线程修改这一变量。
其实就是抢锁,抢到锁的才能进行操作。
二、互斥锁 Mutex
互斥锁有两个方法:加锁、解锁。
一个互斥锁只能同时被一个 goroutine 锁定,其它 goroutine 将阻塞直到互斥锁被解锁(重新争抢对互斥锁的锁定)。
func (m *Mutex) Lock()
func (m *Mutex) Unlock()
三、读写锁 RWMutex
读写锁有四个方法:读的加锁、解锁,写的加锁、解锁。
//写操作的锁定和解锁
func (*RWMutex) Lock
func (*RWMutex) Unlock
//读操作的锁定和解锁
func (*RWMutex) Rlock
func (*RWMutex) RUnlock
当有一个写锁定时,新的写锁定与读锁定都将阻塞直到写解锁。
当有一个读锁定时,新的读锁定可以继续,新的写锁定将等待所有读锁定解锁之后才能够进行写锁定。(读、写互斥。可以有多个读锁,但只能有一个写锁。)