C#面试题更新 2026-08-03

在 C# 多线程编程中,活锁和饥饿分别是指什么?它们各自是如何产生的,并且有哪些典型的应对策略?

考察说明

考查对多线程并发中活锁和饥饿概念的理解及解决方法的掌握。

回答思路

  1. 【回答框架 1】活锁是指多个线程因相互谦让而不断改变状态,却无法推进任务的情况。例如两个线程同时尝试获取两把锁,检测到冲突后都释放自己的锁并重试,导致反复循环但无进展。其本质是线程未阻塞,但整体进度停滞。
  2. 【回答框架 2】饥饿是指线程因优先级过低或资源分配不公,长期得不到所需资源而无法执行。例如低优先级线程被高优先级线程持续抢占 CPU,或线程等待的锁总被其他线程获取。
  3. 【回答框架 3】解决活锁可引入随机退避或让线程按固定顺序尝试获取资源,避免相互谦让。解决饥饿可采用公平锁(如公平调度、排队机制)、提高低优先级线程优先级或使用更均衡的资源分配策略。
  4. 【关键点 1】活锁中线程活跃但无进展,饥饿中线程因资源匮乏而长时间等待。
  5. 【关键点 2】活锁常见于锁冲突后的无策略重试,饥饿常因优先级或调度不均导致。
  6. 【关键点 3】随机退避和公平调度分别是缓解活锁和饥饿的有效手段。
  7. 【易错点 1】活锁与死锁混淆:死锁是阻塞等待,活锁是忙等待但无进展。
  8. 【易错点 2】饥饿不一定导致死锁,但可能降低系统吞吐。
  9. 【易错点 3】仅调整优先级可能引发优先级反转,需结合其他机制。