C# .NET 高级编程:高并发场景下的关键技术 - 锁

1、什么是锁?

锁是一种同步机制,用于保护共享资源的访问。当一个线程获得锁时,其他线程必须等待,直到锁被释放。这样可以确保同一时间只有一个线程能够访问和修改共享资源,从而避免了数据竞争和竞态条件。

2、高并发场景的锁

锁 最为常见的应用就是 高并发的情况下,库存的控制。本次只做简单的单机锁介绍。
直接看代码:
每请求一次库存-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。
439a5ef3f4f32300bc436fea7e398f9b.png

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

a94479d1ba8f8ee7a033de9172b1f757.png

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

7c06fddcaf5adb67394b4ce96fd35d67.png

发现请求后,还有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。调整代码后,再次进行测试:
e3cbf50b6dca820575ec42deaf75f364.png

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

到此为止,问题解决。

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

作者:CHN_CODER

原文网址:cnblogs.com/pzscit/p/17644157.html

版权声明:本文来源于网友收集或网友供稿,仅供学习交流之用,如果有侵权,请转告小编或者留言,本公众号立即删除。

- EOF -

技术群:添加小编微信dotnet999

公众号:Dotnet讲堂

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值