文章
大厂面试
Tadori1zanai 字节中国交易与广告一面
作者:Tadori1zanai 时间:2026.4.28
注:
- 回答多数为 AI 生成,仅供参考。
- 只记录部分面试和部分问题,部分问题暂无回答。
WaitGroup 底层是如何实现的?#
WaitGroup本质是一个带阻塞能力的计数器,用于等待一组 goroutine 执行完成。- 它内部通过原子操作维护计数器,
Add增加任务数,Done减少任务数。 - 当计数器不为 0 时,调用
Wait的 goroutine 会被挂起。 - 最后一个
Done把计数器减为 0 时,会通过 runtime 的信号量机制唤醒所有阻塞的 goroutine。 - 为了降低锁开销,
WaitGroup使用 CAS 维护状态,并结合 runtime 调度器实现阻塞与唤醒。
sync.Once 底层原理#
sync.Once用于保证某个函数在并发环境下只执行一次。- 内部通过原子变量
done和互斥锁实现。 Do方法先通过原子读检查done标志,已经执行过就直接返回。- 未执行时进入加锁慢路径,在临界区内二次检查。
- 执行函数完成后,通过原子写将
done置为 1。