- Java锁的逻辑(结合对象头和ObjectMonitor)
- 还在用饼状图?来瞧瞧这些炫酷的百分比可视化新图形(附代码实现)⛵
- 自动注册实体类到EntityFrameworkCore上下文,并适配ABP及ABPVNext
- 基于Sklearn机器学习代码实战
锁 最为常见的应用就是 高并发的情况下,库存的控制。本次只做简单的单机锁介绍。 直接看代码: 每请求一次库存-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的文章或继续浏览相关文章,希望大家以后支持我的博客! 。
在这篇文章中,我将介绍如何识别导致性能出现问题的查询,如何找出它们的问题所在,以及快速修复这些问题和其他加快查询速度的方法。 你一定知道,一个快速访问的网站能让用户喜欢,可以帮助网站从Goog
就目前情况而言,这个问题不太适合我们的问答形式。我们希望答案得到事实、引用资料或专业知识的支持,但这个问题可能会引发辩论、争论、民意调查或扩展讨论。如果您觉得这个问题可以改进并可能重新开放,visit
2021 年,人们喜欢 Linux 的原因比以往任何时候都多。在本系列中,我将分享使用 Linux 的 21 个不同原因。这里有四个开源工具,可以将任何设备变成 Linux 服务器。 有时,我会发
我使用 Web Essentials 在保存时编译我的 typescript 文件(Visual Studio 2012),但我得到一个空的 js 和这条消息: Compile Error. See
我是一名优秀的程序员,十分优秀!