题目请解释 .NET 中的并发集合Concurrent Collections与传统锁机制lock的区别以及在高并发系统中如何选择在多线程开发中多个线程同时访问共享数据时必须保证线程安全。传统方式通常使用 lockMonitor对共享资源加锁使同一时间只有一个线程能够访问临界区。这种方式实现简单但在高并发环境下容易形成严重的锁竞争导致线程阻塞、上下文切换增加从而降低系统吞吐量。.NET 提供了一系列并发集合例如 ConcurrentDictionary、ConcurrentQueue、ConcurrentBag 等。这些集合通过细粒度锁、无锁算法Lock-Free或分段锁技术实现线程安全。与全局 lock 不同并发集合通常只锁定局部数据区域甚至通过 CASCompare-And-Swap操作避免锁从而允许更多线程并行执行。在高并发系统中如果只是保护少量关键逻辑使用 lock 仍然是可接受方案。但当系统存在大量读写操作时并发集合能够显著减少锁竞争提高扩展性与性能。因此现代 .NET 并发编程更推荐优先使用并发集合而不是手写复杂锁逻辑。 追问一为什么过度使用 lock 会导致性能下降lock 会让线程进入阻塞状态当竞争激烈时大量线程需要等待锁释放CPU 需要频繁进行线程切换。线程切换不仅耗费时间还会破坏 CPU 缓存局部性导致执行效率下降。此外如果锁范围设计不合理还可能产生锁队列堆积使系统吞吐量明显降低因此高并发系统通常避免粗粒度锁。 追问二ConcurrentDictionary 为什么比 Dictionary lock 性能更好ConcurrentDictionary 内部采用分段锁与无锁读策略。读操作通常无需加锁即可完成而写操作只锁定局部桶Bucket而不是整个集合。这意味着多个线程可以同时操作不同数据区域大幅减少竞争。同时其内部实现已针对并发场景优化避免开发者自己设计锁带来的死锁或性能问题。 追问三什么时候仍然需要使用 lock当需要保证多个操作的原子性时例如“读取 → 计算 → 写入”必须作为整体执行并发集合无法覆盖业务一致性需求此时仍需要 lock。此外对非线程安全对象进行组合操作、维护复杂状态机或跨多个资源同步时lock 仍然是最直接可靠的同步手段。#面试 #面试技巧分享 #dotnet面试题 #多线程