首页 > 编程语言 >c# .NET 高级编程 高并发必备技巧 - 锁

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

时间:2023-08-25 18:56:27浏览次数:65  
标签:库存 请求 c# 编程 int key NET stock 1000

锁 最为常见的应用就是 高并发的情况下,库存的控制。本次只做简单的单机锁介绍。
直接看代码:
每请求一次库存-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#,编程,int,key,NET,stock,1000
From: https://www.cnblogs.com/wl-blog/p/17657735.html

相关文章

  • leetcode1260
    这是一道模拟题刚开始准备纯模拟,而后在题解看到一维压缩,才发现其实是将矩阵按行展开后进行k次右移操作。转换成一维后,难点就在转换坐标:行号=idx/列数;列号=idx%列数; ......
  • 使用MediatR和FluentValidation实现CQRS应用程序的数据验证
    本文将重点介绍如何通过MediatR的管道功能将FluentValidation集成到项目中实现验证功能。什么是CQRS?CQRS(CommandQueryResponsibilitySegregation)也叫命令查询职责分离,是近年来非常流行的应用程序架构模式。CQRS背后的理念是在逻辑上将应用程序的流程分成两个独立的流程,即命......
  • 【C#】【Windows 窗体应用】TextBox 的多行实现换行
    1.设置TextBox空间允许多行: this.textBox1.Multiline=true;  2.换行字符是使用"\r\n"。1textBox1.Text+="第0行\r\n";2textBox1.Text+="第1行\r\n";3textBox1.Text+="第2行\r\n";4textBox1.Text+="第3行\r\n";5......
  • 【C#】 文件选择
    1.从工具箱中“双击”FolderBrowserDialog(或则在类中使用newFolderBrowserDialog()均可,本文主要描述窗体使用)。2.加上一个“选择”按钮,在按钮点击事件下添加如下代码,控件可以投入使用了。1///<summary>选择按钮点击事件</summary>2privatevoidBtnSelect_Click(obje......
  • ubuntu 20版本安装vnc连接灰屏问题
    修改vim  ~/.vnc/xstartup#!/bin/shautocutsel-forkxrdb$HOME/.Xresourcesxsetroot-solidgreyexportXKL_XMODMAP_DISABLE=1exportXDG_CURRENT_DESKTOP="GNOME-Flashback:Unity"exportXDG_MENU_PREFIX="gnome-flashback-"unsetDBUS_SESSION......
  • 【C# 】STAThread
    [STAThread]STAThread:Single    Thread    ApartmentThread.(单一线程单元线程)[]是用来表示Attributes;[STAThread]是一种线程模型,用在程序的入口方法上(在C#和VB.NET里是Main()方法),来指定当前线程的ApartmentState是STA。用在其他方法上不产生影响。在aspx页面......
  • Chat Emy会让程序员失业吗?
    ChatEmy具备强大的自动编码能力,可以理解、解析和生成大量的自然语言。传统上,人们需要花费大量的时间和精力来编写和调试代码,但ChatEmy可以通过学习海量数据,自动完成这些复杂的任务,从而减少了程序员的工作量。这让一些人担心,程序员在代码编写方面的需求可能会减少。一些人担心这一......
  • 记录--一个炫酷的css动画
    这里给大家分享我在网上总结出来的一些知识,希望对大家有所帮助最近有一个需求,要我实现一个动画效果,效果如下简单分析了一下效果,是一个3d的效果,首先是一个圆,接着是两段圆环,第三层是一堆小圆环,最里面是一些线上运动,有着渐变色的矩形。第一层的圆环很简单。第二层的圆环其实......
  • java-结束端口对应的process
    importjava.io.BufferedReader;importjava.io.IOException;importjava.io.InputStreamReader;publicclassProcessKiller{publicstaticvoidmain(String[]args){intport=8080;//要释放的端口号try{//构造命令......
  • CentOS 7 上更新系统时间和时区
    要在CentOS7上更新系统时间和时区(CST,即中国标准时间),可以按照以下步骤进行操作:更新系统时间:首先,你可以使用以下命令来手动更新系统时间为当前时间:sudodate+%T-s"hh:mm:ss"替换"hh:mm:ss"为当前的小时、分钟和秒。你也可以更新日期和时间一起,例如:sudodate+%Y%m%......