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

请说明 C# 中 Monitor 类用于线程同步的具体用法,包括其核心方法(如 Enter、Exit、TryEnter、Wait、Pulse、PulseAll)的作用,以及如何处理锁的获取与释放,并说明与 lock 关键字的关系。

技术原理C#

考察说明

考查对 C# 中 Monitor 类进行线程同步的核心机制与常用方法的掌握程度。

回答思路

  1. 【回答框架 1】Monitor 类是 C# 中用于线程同步的机制,基于互斥锁实现,确保同一时刻只有一个线程能访问临界区。其主要方法是 Enter 和 Exit,分别用于获取和释放锁;TryEnter 可尝试获取锁并设置超时,避免无限等待。
  2. 【回答框架 2】使用 Monitor 时,通常需要配合 try-finally 块,在 finally 中调用 Exit 以确保锁被释放,防止死锁。C# 的 lock 关键字是 Monitor.Enter 和 Monitor.Exit 的语法糖,lock 语句内部自动生成 try-finally,但 lock 不支持超时。
  3. 【回答框架 3】Monitor 还提供 Wait、Pulse 和 PulseAll 用于线程间协调。线程在持有锁时调用 Wait 会释放锁并进入等待队列,直到其他线程调用 Pulse 或 PulseAll 通知;Pulse 唤醒等待队列中的一个线程,PulseAll 唤醒全部,但被唤醒的线程需重新获取锁。
  4. 【回答框架 4】Wait、Pulse 应只在锁内使用,否则会抛出异常。使用这些方法可实现生产者-消费者等模式,但需注意条件变量的正确使用,避免信号丢失或虚假唤醒,通常需在循环中检查条件。
  5. 【关键点 1】Monitor 通过 Enter 和 Exit 实现互斥访问。
  6. 【关键点 2】lock 是 Monitor.Enter 和 Exit 的语法糖,但不支持超时。
  7. 【关键点 3】Wait 释放锁并等待通知,Pulse 和 PulseAll 发出通知。
  8. 【关键点 4】Wait 和 Pulse 必须在持有锁时调用。
  9. 【关键点 5】使用 TryEnter 可避免无限等待锁。