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。
c# .NET 高级编程 高并发必备技巧 - 锁

Jmeter 设置如下,一个线程请求1000次,再去查看库存刚好为0,没有任何问题:
c# .NET 高级编程 高并发必备技巧 - 锁

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

调整一下测试参数,5个人同时请求,各请求200次。再去查看库存
c# .NET 高级编程 高并发必备技巧 - 锁

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

发现请求后,还有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。调整代码后,再次进行测试:
c# .NET 高级编程 高并发必备技巧 - 锁

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

到此为止,问题解决。

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

发表评论

评论已关闭。

相关文章