.NET C#基础教程第17天:Interlocked Class

作者:微信公众号:【架构师老卢】
6-10 9:29
30

概述:介绍在多线程应用场景中,使用传统的锁定技术有时会导致原子操作的性能瓶颈。.Net 为所有原子操作提供了一个强大的工具,称为“Interlocked”类,开发人员可以通过它减少争用并提高应用程序的性能。学习目标锁的问题使用互锁类开发人员的先决条件基本了解 C# 编程语言开始了解锁具问题传统上,为了确保多个线程访问共享资源时的线程安全,开发人员使用锁。锁定可防止多个线程同时进入关键代码段,从而确保一次只有一个线程可以修改共享资源。private int _counter;private readonly object _syncRoot = new object();public void Inc

介绍

在多线程应用场景中,使用传统的锁定技术有时会导致原子操作的性能瓶颈。.Net 为所有原子操作提供了一个强大的工具,称为“Interlocked”类,开发人员可以通过它减少争用并提高应用程序的性能。

学习目标

  • 锁的问题
  • 使用互锁类

开发人员的先决条件

  • 基本了解 C# 编程语言

开始

了解锁具问题

传统上,为了确保多个线程访问共享资源时的线程安全,开发人员使用锁。锁定可防止多个线程同时进入关键代码段,从而确保一次只有一个线程可以修改共享资源。

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

相关代码下载地址
重要提示!:取消关注公众号后将无法再启用回复功能,不支持解封!
第一步:微信扫码关键公众号“架构师老卢”
第二步:在公众号聊天框发送code:28291,如:code:28291 获取下载地址
第三步:恭喜你,快去下载你想要的资源吧
阅读排行