.Net 为所有原子操作提供了一个称为“Interlocked”类的强大工具,开发人员可以通过该工具减少争用并提高应用程序的性能。 介绍 在多线程应用场景中,使用传统的锁定技术有时会导致原子操作的性能瓶颈。.Net 为所有原子操作提供了一个称为“Interlocked”类的强大工具,开发人员可以通过它减少争用并提高应用程序的性能。 学习目标 锁的问题 使用互锁类 开发人员的先决条件 对 C# 编程语言有基本了解 30 天 .Net 挑战 入门 理解锁的问题 传统上,为了在多个线程访问共享资源时确保线程安全,开发人员会使用锁。锁定可防止多个线程同时进入代码的关键部分,从而确保每次只有一个线程可以修改共享资源。 private int _counter; private readonly object _syncRoot = new object(); public void IncrementCounter() { lock (_syncRoot) { _counter++; } } 上述方法引入了潜在性能问题的风险,称为争用,其中当多个线程同时尝试访问锁时,除了成功获取锁的线程之外,其他线程都会被搁置。 互锁类:一种更好的方法 .NET 框架提供了 Interlocked 类作为 System.Threading 命名空间的一部分,旨在高效执行原子操作。原子操作是不可分割的;它们完全完成而不会中断。 private int _counter; public void IncrementCounter() { Interlocked.Increment(ref _counter); } 由于 Interlocked 类不需要锁,因此它解决了传统方法中提到的争用问题。 完整示例 添加新类名IncrementClass,并添加以下代码片段 public static class IncrementClass { private static int _counter = 0; /// <summary> /// Outputs /// Counter value: 10 /// </summary> public static void TestIncrementCounter() { // Create an array to hold the tasks Task[] tasks = new Task[10]; // Initialize and start tasks for (int i = 0; i < tasks.Length; i++) { tasks[i] = Task.Run(() => IncrementCounter()); } // Wait for all tasks to complete Task.WaitAll(tasks); Console.WriteLine($"Counter value: {_counter}"); } public static void IncrementCounter() { // Safely increment the counter across multiple threads Interlocked.Increment(ref _counter); } } 从主方法调用如下: #region Day 17: Increment Class IncrementClass.TestIncrementCounter(); #endregion 控制台输出: Counter value: 10 GitHub 上的完整代码 GitHub — ssukhpinder/30DayChallenge.Net C# 编程 感谢您成为 C# 社区的一员!离开之前: 关注我们: | | | 访问我们的其他平台: Youtube X LinkedIn Dev.to GitHub