• c# 同步异步锁


    在 C# 中,synchronization(同步)和asynchronization(异步)锁都是用来保护共享资源的。在单线程环境中,这些锁不是必要的,但在多线程环境中,由于多个线程可以访问和修改同一资源,因此需要使用这些锁来保证线程安全。

    同步锁

    主要使用 lock 关键字来实现。例如:

    1. private readonly object lockObject = new object();
    2. public void SomeMethod()
    3. {
    4. lock(lockObject)
    5. {
    6. // 确保只有一个线程可以进入这个代码块
    7. // 执行一些与共享资源相关的操作
    8. }
    9. }

    当一个线程进入 lock 块时,lockObject 对象被锁定,直到该线程执行完毕并离开 lock 块时才会释放锁。这样可以确保在 lock 块内的代码只有一个线程执行。其他线程必须等待锁的释放才能进入该代码块。

    异步锁

    主要使用 async 和 await 关键字来实现。例如:

    1. private readonly System.Threading.SemaphoreSlim slimlock = new SemaphoreSlim(1);
    2. public async Task SomeMethodAsync()
    3. {
    4. await slimlock.WaitAsync();
    5. try
    6. {
    7. // 确保只有一个线程可以进入这个代码块
    8. // 执行一些与共享资源相关的操作
    9. }
    10. finally
    11. {
    12. slimlock.Release();
    13. }
    14. }

    SemaphoreSlim 是一个线程安全的计数器,可以用来确保只有固定数量的线程可以同时访问某个资源。在上面的代码中,我们创建了一个 SemaphoreSlim 对象,设置了初始数量为 1,这意味着只有一个线程可以同时访问共享资源。在方法中,我们使用 await semaphore.WaitAsync() 来等待信号量的释放,然后在 finally 块中释放信号量 semaphore.Release()。

    无论使用同步锁还是异步锁,都要小心使用,确保不会导致死锁或线程饥饿等问题。

    第三方使用异步锁

    安装nuget包 Nito.AsyncEx 异步的拓展,和同步方式类似直接lock使用

    1. using Nito.AsyncEx;
    2. private readonly AsyncLock asyncLock = new AsyncLock();
    3. public async Task SomeMethodAsync()
    4. {
    5. lock(await asyncLock.LockAsync())
    6. {
    7. // 确保只有一个线程可以进入这个代码块
    8. // 执行一些与共享资源相关的操作
    9. }
    10. }

  • 相关阅读:
    springboot网上投资借贷中介服务毕业设计-附源码221506
    PostgreSQL执行计划获取与修改
    AI学习指南机器学习篇-高斯朴素贝叶斯算法简介
    一定要用Photoshop?no!动手用Python做一个颜色提取器! ⛵
    word文档怎么转换成pdf?几个实用文档转换方法
    具身智能(Embodied AI)
    Spring Data JPA系列5:让IDEA自动帮你写JPA实体定义代码
    MySQL基础(2)
    GBASE 8C——SQL参考6 sql语法(5)
    三菱PLC FX3U脉冲轴回原功能块(MC_Home_P)
  • 原文地址:https://blog.csdn.net/qq_36535245/article/details/133854515