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

在多线程环境下,C# 的 Interlocked 类提供了哪些原子操作,它的主要用途是什么?

风险判断技术原理C#

考察说明

考查对 Interlocked 原子操作机制及其在多线程编程中作用的理解。

回答思路

  1. 【回答框架 1】Interlocked 是 System.Threading 命名空间下的静态类,提供对变量进行原子操作的方法,如 Increment、Decrement、Add、Exchange、CompareExchange 等。原子操作意味着操作不可分割,在多线程竞争同一变量时,能保证操作的完整性和一致性。
  2. 【回答框架 2】它的主要作用是在多线程编程中提供无锁的线程安全机制,避免使用 lock 带来的性能开销。在较新版本的 .NET 中,也可以使用 Interlocked 的方法对指定内存地址或引用类型进行操作,确保对共享数据的线程安全访问。
  3. 【回答框架 3】Interlocked 的操作基于 CPU 的原子指令(如 x86 的 lock 前缀指令),因此执行效率高,并且能避免死锁。此外,它内存屏障的语义,可以防止指令重排序,确保在多核处理器上的可见性。
  4. 【回答框架 4】在实际应用中,Interlocked 常用于计数器、标志位的更新、自旋锁的实现等场景。例如,使用 Interlocked.Increment 实现一个线程安全的计数器。
  5. 【回答框架 5】需要注意的是,Interlocked 只保证单个操作的原子性,对于包含多个操作的复合操作,仍需使用锁或其他同步机制。
  6. 【关键点 1】Interlocked 提供原子操作的静态方法,如 Increment、Add、Exchange、CompareExchange。
  7. 【关键点 2】基于 CPU 原子指令,性能开销低,且避免死锁。
  8. 【关键点 3】适用于单变量读改写场景,如计数器、标志位、自旋锁。
  9. 【关键点 4】不能保证多个操作的原子性,复杂操作仍需 lock 等机制。
  10. 【易错点 1】认为 Interlocked 能像 lock 一样提供代码块级别的原子性,实际上它只针对单个操作。
  11. 【易错点 2】在 32 位系统上使用 Interlocked 操作 64 位变量时,务必确保变量对齐(如使用 long 类型且字段对齐),否则可能抛出异常。
  12. 【易错点 3】错误地用 Interlocked 去保护读写复合逻辑,导致数据竞争。