在计算机世界里,对于锁大家并不陌生,在现代所有的语言中几乎都提供了语言级别锁的实现,为什么我们的程序有时候会这么依赖锁呢?这个问题还是要从计算机的发展说起,随着计算机硬件的不断升级,多核cpu,多线程,多通道等技术把计算机的计算速度大幅度提升,原来同一时间只能执行一条cpu指令的时代已经过去.随着多条cpu指令可以并行执行的原因,原来不曾出现的资源竞争随着出现,在程序中的体现就是随处可见的多线程环境.比如要更新数据库的一个信息,如果没有并发控制,多个线程同时操作的话,就会出现互相覆盖的现象发生.
锁要解决的就是资源竞争的问题,也就是要把执行的指令顺序化.
在互联网背景下,电商行业是普遍都是多线程执行,并发量大.比如下单秒杀抢购商品活动,属于高并发情况,库存的保证就尤其重要了,不能出现超卖现象.程序员所要做的事情就是需要单线程执行获取库存,再减库存操作,保证数据原子性.
在多台服务器中,锁就是重点.
数据库不存在的情况下,用Dictionary来代替
创建了Store后,主程序创建下单,单线程执行.
执行结果:
改成多线程执行,直接出现超卖现象,其中用Task.Run 模拟多线程,其中Order(int i) i变量注意,不能直接填写i,异步中上下文不存在,因为主线程以及跑完了,再运行异步Task线程,这时变量已是最后一个被覆盖.
解决方案是重复赋值变量替换
结果:
解决方案:
lock很明显影响性能.
正常.
ConcurrentDictionary 本身是线程安全的,源代码就是加了lock
执行结果符合.
redis是单线程运行,所以适合.原理也很简单,运用redis以下指令
原理如下:
①.、先获取redis锁,设置一个随机字符串
结果显示0,正确,没超卖
以上就是土嘎嘎小编为大家整理的.net Redis分布式锁,Dictionary,ConcurrentDictionary 介绍.net Redis分布式锁,Dictionary,ConcurrentDictionary 介绍相关咨询咨询主题介绍,如果您觉得小编更新的文章只要能对粉丝们有用,就是我们最大的鼓励和动力,不要忘记讲本站分享给您身边的朋友哦!!