c# 同步异步锁

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

同步锁

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

private readonly object lockObject = new object();

public void SomeMethod()
{
    lock(lockObject)
    {
        // 确保只有一个线程可以进入这个代码块
        // 执行一些与共享资源相关的操作
    }
}

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

异步锁

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

    private readonly  System.Threading.SemaphoreSlim slimlock = new SemaphoreSlim(1);

public async Task SomeMethodAsync()
{
    await slimlock.WaitAsync();
    try
    {
        // 确保只有一个线程可以进入这个代码块
        // 执行一些与共享资源相关的操作
    }
    finally
    {
        slimlock.Release();
    }
}

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

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

第三方使用异步锁

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

using Nito.AsyncEx;


   private readonly AsyncLock asyncLock = new AsyncLock();

public async Task SomeMethodAsync()
{
     lock(await asyncLock.LockAsync())
    {
        // 确保只有一个线程可以进入这个代码块
        // 执行一些与共享资源相关的操作
    }
}

  • 1
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值