Go面试题更新 2026-08-05

在 Go 语言里,sync.Cond 的 Wait 方法应当如何调用?请说明其使用方式与注意事项。

技术原理Go

考察说明

考查对 Go 并发原语 sync.Cond 中 Wait 方法调用规范与内部机制的理解。

回答思路

  1. 【回答框架 1】sync.Cond 用于在多个 goroutine 间按条件等待或通知,Wait 方法必须在持有与 Cond 关联的锁(通常是 Mutex)时调用,否则会引发 panic。
  2. 【回答框架 2】Wait 的内部行为是:先原子地释放关联锁并挂起当前 goroutine,直到被 Signal 或 Broadcast 唤醒后,重新获取该锁并返回,因此调用后需在循环中重新检查条件。
  3. 【回答框架 3】标准使用模式为:调用方先加锁,再用 for 循环判断条件是否满足,不满足则调用 Wait,满足则继续执行并解锁;避免使用 if 判断,防止虚假唤醒或条件变化导致错误。
  4. 【回答框架 4】Wait 方法没有参数,也不返回错误,其唤醒通知由 Cond 的 Signal(唤醒一个等待者)或 Broadcast(唤醒全部等待者)触发,调用通知方法时也需持有锁。
  5. 【回答框架 5】使用 Cond 时需注意与锁的配对,确保每次 Wait 前已加锁,且 Wait 返回后条件可能仍不满足,必须重新检查;同时避免在持有锁时长时间阻塞,以免影响并发性能。
  6. 【关键点 1】Wait 必须在持有 Cond 关联锁时调用,否则 panic。
  7. 【关键点 2】Wait 会先释放锁并挂起,唤醒后重新获取锁再返回。
  8. 【关键点 3】使用 for 循环而非 if 检查条件,以应对虚假唤醒。
  9. 【关键点 4】Signal 唤醒一个等待者,Broadcast 唤醒全部,调用时也需持锁。
  10. 【关键点 5】Cond 适用于需要条件变量的场景,但需谨慎管理锁与等待循环。
  11. 【易错点 1】未持锁调用 Wait 导致 panic。
  12. 【易错点 2】用 if 判断条件可能因虚假唤醒或条件变化而错误继续执行。
  13. 【易错点 3】忘记在 Wait 返回后重新检查条件,导致逻辑错误。