在多线程应用场景中,使用传统的锁定技术有时会导致原子操作的性能瓶颈。.Net 为所有原子操作提供了一个强大的工具,称为“Interlocked”类,开发人员可以通过它减少争用并提高应用程序的性能。
传统上,为了确保多个线程访问共享资源时的线程安全,开发人员使用锁。锁定可防止多个线程同时进入关键代码段,从而确保一次只有一个线程可以修改共享资源。
private int _counter;
private readonly object _syncRoot = new object();
public void IncrementCounter()
{
lock (_syncRoot)
{
_counter++;
}
}
上述方法引入了称为争用的潜在性能问题的风险,其中当多个线程尝试同时访问锁时,它们将被搁置,除非成功获得锁的线程除外。
.NET Framework 将该类作为命名空间的一部分提供,旨在有效地执行原子操作。原子操作是不可分割的;它们完全不间断地完成。InterlockedSystem.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);
}
}
从 main 方法调用,如下所示
#region Day 17: Increment Class
IncrementClass.TestIncrementCounter();
#endregion
控制台输出
Counter value: 10
源代码获取:公众号回复消息【code:28291
】