每日一题:在 .NET 中,lock 的底层原理?

📅 发布时间:2026/7/16 12:47:26 👁️ 浏览次数:
每日一题:在 .NET 中,lock 的底层原理?
在 .NET 中lock 的底层原理是什么它适合解决什么问题有没有替代方案参考答案lock 本质是对 Monitor 的封装用于实现互斥访问。当一个线程进入 lock 代码块时会尝试获取对象的同步锁若锁已被占用线程会被阻塞直到锁释放。lock 适合保护临界区资源例如共享变量、集合写操作等。它保证同一时刻只有一个线程执行关键代码从而避免数据竞争问题。但 lock 是阻塞式同步线程会挂起等待若使用不当会导致性能下降、死锁或锁竞争严重。替代方案包括Interlocked用于简单原子操作性能高ReaderWriterLockSlim读多写少场景SemaphoreSlim控制并发数量无锁并发集合如 ConcurrentDictionary选择哪种方式取决于并发读写比例和性能要求。高频追问 1为什么说 lock 可能影响性能因为 lock 是阻塞机制当线程获取不到锁时会进入等待状态触发上下文切换。频繁竞争会导致线程挂起与唤醒成本上升降低吞吐量。在高并发环境中大量锁竞争可能使 CPU 时间浪费在线程调度上而非业务逻辑本身。高频追问 2什么情况下会发生死锁当多个线程互相持有对方所需的锁并且都在等待对方释放时就会形成死锁。常见场景包括锁嵌套顺序不一致、跨方法锁定多个对象等。避免方式包括统一加锁顺序、缩小锁粒度、避免在锁中调用外部方法。高频追问 3lock 和 Interlocked 有什么区别Interlocked 适用于简单数值操作如递增、比较交换底层基于 CPU 原子指令不会阻塞线程性能优于 lock。但它只能用于单变量原子操作无法保护复杂逻辑。lock 适用于多步骤、需要整体一致性的代码块。高频追问 4为什么不建议 lock(this)因为 this 可能被外部代码获取并加锁导致不可控的死锁风险。更安全的做法是使用 private readonly object _lock new object(); 作为专用锁对象避免锁暴露给外部。#面试题 #dotnet面试题 #面试真题 #dotnet中间件 #程序员进阶指南