解释一下Go中的锁有哪些 ?
在Go语言中,主要提供了两种锁结构:sync.Mutex
和sync.RWMutex
。
sync.Mutex
: 这是最基本的一种锁类型,又称为互斥锁。它只有两个方法:Lock
和Unlock
。一次只有一个goroutine能够获取到Mutex
,其他试图获取该Mutex
的goroutine将会被阻塞,直到该Mutex
被解锁。
var mu sync.Mutex
mu.Lock()
// critical section
mu.Unlock()
sync.RWMutex
: 这是一种读写锁,它和Mutex
的区别在于,它允许多个goroutine同时读取,但是写入时必须完全互斥。也就是说,当有goroutine在进行写操作时,其他任何goroutine(无论读或写)都会被阻塞;当有goroutine在读取时,其他读取的goroutine不会被阻塞,但是写入的goroutine会被阻塞。
var rwmu sync.RWMutex
rwmu.RLock()
// read operation
rwmu.RUnlock()
rwmu.Lock()
// write operation
rwmu.Unlock()
注意:在使用锁的时候,一定要避免发生死锁。例如,如果一个goroutine已经获取了一个Mutex
,然后又试图再次获取,这就会发生死锁,该goroutine会被永久阻塞。因此,设计锁的使用策略时,一定要保证每个Mutex
在任何时刻最多只被一个goroutine锁定。