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

请阐述 C# 中 lock 关键字用于线程同步的具体用法,并解释其背后的实现原理。

考察说明

考察对 C# lock 关键字语法及线程同步机制的理解。

回答思路

  1. 【回答框架 1】lock 关键字是 C# 中用于实现线程互斥的语法糖,其典型用法是 lock (lockObject) { 临界区代码 }。它确保同一时刻只有一个线程能够进入该代码块,从而保护共享资源。lock 的对象可以是任意引用类型,但通常使用私有静态对象或 this。
  2. 【回答框架 2】lock 内部实际上是 Monitor 类的方法调用。编译器将 lock 语句转换为 try-finally 结构,在 try 块开始时调用 Monitor.Enter(lockObject),并在 finally 块中调用 Monitor.Exit(lockObject),以确保即使发生异常也能释放锁。此外,lock 使用 Monitor 的互斥机制,可保证线程安全。
  3. 【回答框架 3】使用 lock 时需要注意避免死锁。应避免嵌套 lock 或长时间持有锁,否则可能导致性能瓶颈。此外,lock 只能锁引用类型,不能锁值类型,因为值类型会被装箱,导致每次操作可能针对不同对象,无法实现同步。
  4. 【回答框架 4】如果需要对临界区进行更细粒度的控制,可以结合 Monitor 类的方法如 Monitor.TryEnter 来实现带超时的锁,或者使用其他同步原语如 SemaphoreSlim、ReaderWriterLockSlim 等。
  5. 【关键点 1】lock 是 Monitor 的语法糖,通过 try-finally 保证锁的释放。
  6. 【关键点 2】lock 对象必须是引用类型,避免锁定值类型导致无同步效果。
  7. 【关键点 3】避免嵌套 lock 和长时间持锁,减少死锁和性能风险。
  8. 【易错点 1】锁定值类型变量通常无效,因为每次装箱产生不同对象。
  9. 【易错点 2】锁定字符串字面量可能导致意外冲突,因字符串驻留。
  10. 【易错点 3】lock 不能保证进程间同步,仅适用于进程内线程同步。