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

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

时间:2023-08-20 16:57:30浏览次数:33  
标签:库存 请求 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。

到此为止,问题解决。

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

标签:库存,请求,c#,编程,int,key,NET,stock,1000
From: https://www.cnblogs.com/pzscit/p/17644157.html

相关文章

  • [原创] TShock插件 - LanguageSwitcher(语言切换器)
    项目地址TShock插件-LanguageSwitcher(语言切换器)语言切换器一个TShock插件,更简单的切换语言,面板服友好已知Bug使用简体中文(也可能存在于其他语言,自行测试)时,无法使用/help命令(此bug仅存在于移动端,且与插件本身无关,系TShock自身Bug)命令/langhelp(获取帮助)/lang[ID](......
  • 西农2022级ACM招新考题
    准备放弃一段时间算法。西农2022级ACM招新上周结束了,五一假期研究了一下题解,整理发在博客。1.这真的是签到题print("\"ACMwelcomesyou\\n\"")2.4和数#include<bits/stdc++.h>usingnamespacestd;constintmaxn=1e6+10;intf[maxn+1];intl,r;boolche......
  • jmeter详解-线程组详解(5)-jp@gc - Ultimate Thread Group
    添加方式:右键测试计划->添加->Threads(Users)->jp@gc-UltimateThreadGroup页面说明:StartThreadsCount:当前行的线程总数InitialDelay/sec:延时启动当前行的线程,单位:秒StartupTime/sec:启动当前行所有线程达峰值所需时间,单位:秒HoldLoadFor/sec:当前行线程达到峰值......
  • 利用PCRE回溯次数限制绕过安全限制
    第一部分:正则表达式和回溯基础1、正则表达式概述正则表达式是一种用于匹配字符串模式的工具。其在文本搜索、数据验证等方面具有强大的应用。在匹配的过程中,会使用有限状态自动机的概念,包括确定性有限状态自动机(DFA)和非确定性有限状态自动机(NFA)。2、回溯的过程正则引擎使用回......
  • C++ 可见性
    可见性比较简单,很好理解,长话短说=v=外部的类派生类同一个类private不可访问不可访问可以访问protected不可访问可以访问可以访问public可以访问可以访问可以访问#include<iostream>usingnamespacestd;classA{private: intx;protected......
  • C++ 成员初始化列表
    成员初始化列表成员初始化列表时对象初始化成员变量的一种方法。使用方式如下(两种书写习惯)ClassName(args):varName1(value),...,varNameN(value){//这是一个构造函数//...CODE...}ClassName(args):varName1(value),...,varNameN(value){//这......
  • C++ const和mutable
    const和mutable这里只说const在c++中的特殊用法。用const修饰函数的成员函数。被const修饰的成员函数无法修改函数内的其他成员。可以认为这个函数变成了一个“只读”的状态。Likethis://注意const在括号后面,不要写成constxxxxx(){...}了intgetStatus()const{ returnm......
  • C++ new和delete
    new关键字在C++中,当我们在函数内声明一个变量时,变量会被放在栈(stack)中。栈中的内存离开代码块就被释放了。而且栈的内存很小,当我们声明了大量变量可能会导致内存不足。内存除了栈以外,还有堆(heap),当我们在函数外声明一个全局变量时,这个变量就放在堆上。堆是程序未使用的内存,可以被......
  • c++ 丢失笔记 [运算符重载、this指针、复制与拷贝构造、生存周期、箭头操作符]
    运算符重载、this指针、复制与拷贝构造、生存周期、箭头操作符有一部分是学校的OJ里做题需要就提前学了,然后没记笔记,有一部分是笔记丢了。不打算补这些笔记。不过还是在这里mark一下++运算符的重载。因为++运算符可以前置也可以后置,所以这里需要注意一下,如果是后置++,需要一个in......
  • C++ 隐式转换与explicit关键字
    隐式转换与explicit关键字隐式转换函数构造的隐式转换,直接上代码:#include<bits/stdc++.h>classEntity{private: std::stringm_Name; intm_Age;public: Entity(conststd::string&name) :m_Name(name),m_Age(-1){} Entity(intage) :m_Name("Unknown"),m_A......