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。
到此为止,问题解决。
但是,实际应用场景中,高并发的应用,都会多机分布式部署。分布式部署要怎么解决?大家思考一下。
转 https://www.cnblogs.com/pzscit/p/17644157.html
标签:
C#
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】凌霞软件回馈社区,博客园 & 1Panel & Halo 联合会员上线
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】博客园社区专享云产品让利特惠,阿里云新客6.5折上折
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 一个费力不讨好的项目,让我损失了近一半的绩效!
· 清华大学推出第四讲使用 DeepSeek + DeepResearch 让科研像聊天一样简单!
· 实操Deepseek接入个人知识库
· CSnakes vs Python.NET:高效嵌入与灵活互通的跨语言方案对比
· Plotly.NET 一个为 .NET 打造的强大开源交互式图表库
2022-08-25 彻底了解线程池的原理——40行从零开始自己写线程池
2022-08-25 不安装运行时运行.NET程序
2022-08-25 基于.NET6、FreeSql、若依UI、LayUI、Bootstrap构建插件式的CMS
2022-08-25 【原创】只用Asp.NET Core Web API与Vue 3.0搭建前后分离项目
2022-08-25 学长告诉我,大厂MySQL都是通过SSH连接的
2022-08-25 你有对象类,我有结构体,Go lang1.18入门精炼教程,由白丁入鸿儒,go lang结构体(struct)的使用EP06
2022-08-25 面试突击73:IoC 和 DI 有什么区别?