前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >【锁】.NET 高级编程高并发必备技巧

【锁】.NET 高级编程高并发必备技巧

作者头像
郑子铭
发布2024-04-15 13:16:54
800
发布2024-04-15 13:16:54
举报

前言

锁最为常见的应用就是高并发的情况下,库存的控制。本次只做简单的单机锁介绍。

正文

直接看代码

每请求一次库存-1. 假如库存1000,在1000个人请求之后,库存将变为0

代码语言:javascript
复制
public int Reduce0()
{
        int r = 0;
        string key = "stock";
        string stock = Rds.cli.Get(key);
        int.TryParse(stock, out r);
        if (r > 0)
        {
            r--;
            Rds.cli.Set(key, r);
        }
        else
        {
            throw new Exception("库存用尽!");
        }
        return r;
}

本次测试使用Jmeter进行测试。先初始化库存为1000。

Jmeter 设置如下,一个线程请求1000次,再去查看库存刚好为0,没有任何问题:

调整一下测试参数,5个人同时请求,各请求200次。再去查看库存

发现请求后,还有279的库存。明明请求了1000次。但是还有279的库存,明显不对。

造成次问题的原因很简单,就是在库存还没完全减的情况下,有另外一个、或多个线程同时发出了请求,而库存只减少了1

只要还有库存,就可以继续请求,到了库存完全为0的时候,已经超过1000个人进行了请求。与实际库存不符合。

为了解决这个问题。我们简单调整一下代码:

代码语言:javascript
复制
private static object lck = new object();
[HttpGet]
public  int Reduce1()
{
    lock(lck)
    {
        int r = 0;
        string key = "stock";
        string stock = Rds.cli.Get(key);
        r = int.Parse(stock);
        if (r > 0)
        {
            r--;
            Rds.cli.Set(key, r);
        }
        else
        {
            throw new Exception("库存用尽!");
        }
        return r;
    }
}

声明一个静态变量,然后再方法体内 使用lock。调整代码后,再次进行测试:

发现 请求1000次后,库存为0。调整测试参数 100人*10次。测试结果依然为0。

到此为止,问题解决。

但是,实际应用场景中,高并发的应用,都会多机分布式部署。分布式部署要怎么解决?大家思考一下。

本文参与 腾讯云自媒体分享计划,分享自微信公众号。
原始发表:2024-04-12,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 DotNet NB 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 前言
相关产品与服务
腾讯云服务器利旧
云服务器(Cloud Virtual Machine,CVM)提供安全可靠的弹性计算服务。 您可以实时扩展或缩减计算资源,适应变化的业务需求,并只需按实际使用的资源计费。使用 CVM 可以极大降低您的软硬件采购成本,简化 IT 运维工作。
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档