gpt4 book ai didi

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

转载 作者:我是一只小鸟 更新时间:2023-08-20 22:33:45 27 4
gpt4 key购买 nike

锁 最为常见的应用就是 高并发的情况下,库存的控制。本次只做简单的单机锁介绍。 直接看代码: 每请求一次库存-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.

到此为止,问题解决.

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

最后此篇关于c#.NET高级编程高并发必备技巧-锁的文章就讲到这里了,如果你想了解更多关于c#.NET高级编程高并发必备技巧-锁的内容请搜索CFSDN的文章或继续浏览相关文章,希望大家以后支持我的博客! 。

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com