Jan 01, 1970
.Net 为所有原子操作提供了一个称为“Interlocked”类的强大工具,开发人员可以通过该工具减少争用并提高应用程序的性能。
在多线程应用场景中,使用传统的锁定技术有时会导致原子操作的性能瓶颈。.Net 为所有原子操作提供了一个称为“Interlocked”类的强大工具,开发人员可以通过它减少争用并提高应用程序的性能。
传统上,为了在多个线程访问共享资源时确保线程安全,开发人员会使用锁。锁定可防止多个线程同时进入代码的关键部分,从而确保每次只有一个线程可以修改共享资源。
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 — ssukhpinder/30DayChallenge.Net
感谢您成为 C# 社区的一员!离开之前: