在Go语言中,常见的锁有以下几种: 1. 互斥锁(Mutex):互斥锁是最简单的一种锁,它只允许一个协程在同一时间访问共享资源。通过`sync.Mutex`类型实现。使用`Lock()`方法获取锁,使用`Unlock()`方法释放锁。 ```go var mu sync.Mutex // 保护共享资源的临界区 mu.Lock() // 访问共享资源 // ... mu.Unlock() ``` 2. 读写锁(RWMutex):读写锁允许多个协程同时读取共享资源,但只允许一个协程写入共享资源。通过`sync.RWMutex`类型实现。使用`RLock()`方法获取读锁,使用`RUnlock()`方法释放读锁;使用`Lock()`方法获取写锁,使用`Unlock()`方法释放写锁。 ```go var rwmu sync.RWMutex // 读取共享资源的临界区 rwmu.RLock() // 读取共享资源 // ... rwmu.RUnlock() // 写入共享资源的临界区 rwmu.Lock() // 写入共享资源 // ... rwmu.Unlock() ``` 3. 条件锁(Cond):条件锁用于实现协程之间的同步,当某个条件为真时,允许一个或多个协程进入临界区执行。通过`sync.Cond`类型实现。使用`L()`方法获取锁,使用`Wait()`方法等待条件满足,使用`Signal()`或`Broadcast()`方法发送信号通知等待的协程。 ```go var cond sync.Cond var flag bool = false // 等待条件满足的协程 cond.L().Lock() for !flag { cond.Wait() } // 执行临界区代码 // ... cond.L().Unlock() // 修改条件并通知等待的协程 flag = true cond.Signal() // 或者 cond.Broadcast() 通知所有等待的协程 ``` [2023-11-09 18:15:16 | AI写代码神器 | 449点数解答]