• c# .NET 高级编程 高并发必备技巧 - 锁


    锁 最为常见的应用就是 高并发的情况下,库存的控制。本次只做简单的单机锁介绍。
    直接看代码:
    每请求一次库存-1. 假如库存1000,在1000个人请求之后,库存将变为0。

         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个人进行了请求。与实际库存不符合。

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

            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。

    到此为止,问题解决。

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

  • 相关阅读:
    架构师日记-从代码到设计的性能优化指南 | 京东云技术团队
    PysparkNote103---window滑窗
    【PostgreSQL】事务、并发、锁
    Redis概述
    【1107】
    【生成式人工智能-九-大型语言模型的幻觉、偏见等安全性问题】
    Springboot2.x开启跨域配置详解
    vue3总结
    Ubuntu下载
    java-php-python-ssm学术会议论文稿件管理系统计算机毕业设计
  • 原文地址:https://www.cnblogs.com/pzscit/p/17644157.html