经验首页 前端设计 程序设计 Java相关 移动开发 数据库/运维 软件/图像 大数据/云计算 其他经验
当前位置:技术经验 » 程序设计 » C# » 查看文章
c# .NET 高级编程 高并发必备技巧 - 锁
来源:cnblogs  作者:CHN_CODER  时间:2023/8/21 8:57:06  对本文有异议

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

  1. public int Reduce0()
  2. {
  3. int r = 0;
  4. string key = "stock";
  5. string stock = Rds.cli.Get(key);
  6. int.TryParse(stock, out r);
  7. if (r > 0)
  8. {
  9. r--;
  10. Rds.cli.Set(key, r);
  11. }
  12. else
  13. {
  14. throw new Exception("库存用尽!");
  15. }
  16. return r;
  17. }

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

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

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

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

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

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

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

  1. private static object lck = new object();
  2. [HttpGet]
  3. public int Reduce1()
  4. {
  5. lock(lck)
  6. {
  7. int r = 0;
  8. string key = "stock";
  9. string stock = Rds.cli.Get(key);
  10. r = int.Parse(stock);
  11. if (r > 0)
  12. {
  13. r--;
  14. Rds.cli.Set(key, r);
  15. }
  16. else
  17. {
  18. throw new Exception("库存用尽!");
  19. }
  20. return r;
  21. }
  22. }

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

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

到此为止,问题解决。

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

原文链接:https://www.cnblogs.com/pzscit/p/17644157.html

 友情链接:直通硅谷  点职佳  北美留学生论坛

本站QQ群:前端 618073944 | Java 606181507 | Python 626812652 | C/C++ 612253063 | 微信 634508462 | 苹果 692586424 | C#/.net 182808419 | PHP 305140648 | 运维 608723728

W3xue 的所有内容仅供测试,对任何法律问题及风险不承担任何责任。通过使用本站内容随之而来的风险与本站无关。
关于我们  |  意见建议  |  捐助我们  |  报错有奖  |  广告合作、友情链接(目前9元/月)请联系QQ:27243702 沸活量
皖ICP备17017327号-2 皖公网安备34020702000426号