【C#】知识点实践序列之Lock简单解决并发引起数据重复问题

欢迎来到《小5讲堂之知识点实践序列》文章,大家好,我是全栈小5。
这是2023年第3篇文章,此篇文章是C#知识点实践序列文章,博主能力有限,理解水平有限,若有不对之处望指正!
本篇在Lock锁定代码块基础上进行简单解决并发问题,确保不会出现重复数据。

在这里插入图片描述

目录

  • 前言
  • 实践场景
    • 用户编码重复
      • 效果
      • 代码
    • 用户编码唯一
      • 效果
      • 代码
  • 并发基本概念

在这里插入图片描述

前言

前两篇文章已经回顾基本概念一级Lock锁定代码块的实践例子,以及简单了解了多线程的基本信息。

实践场景

有一个用户注册的功能,通过简单并发测试,在不进行索引等情况下,对比加锁和不加锁,用户表重复记录情况

用户编码重复

在并发情况下,如果方法代码和数据库没有做唯一处理,那么进行用户注册时,用户编码重复概率是很大的。
下面是逻辑是,设置3个异步方法模拟3个并发访问,他们之间就极有可能是同时执行同一个方法,用户编码就可能会重复。

效果

在这里插入图片描述

  • 重复数据
    从下图可以知道,GZ0008、GZ0018、GZ00021,这就会出现重复了,相对于用户编码就不是唯一,也就无法满足实际场景。
    在这里插入图片描述

代码

namespace XxxData
{/// <summary>/// 解决数据重复/// </summary>public partial class LockUser : Form{public LockUser(){InitializeComponent();CheckForIllegalCrossThreadCalls = false;}private void Form1_Load(object sender, EventArgs e){}int userCodeIndex = 0;private void TargetData(){userCodeIndex += 1;txtInfo.AppendText($"GZ{userCodeIndex.ToString().PadLeft(5, '0')}\r\n");}private void btnA_Click(object sender, EventArgs e){// ===模拟并发===// 用户并发a区域Task.Run(() =>{for(int i = 0; i < 10; i++){TargetData();Thread.Sleep(10);}});// 用户并发b区域Task.Run(() =>{for (int i = 0; i < 10; i++){TargetData();Thread.Sleep(10);}});// 用户并发c区域Task.Run(() =>{for (int i = 0; i < 10; i++){TargetData();Thread.Sleep(10);}});}}
}

用户编码唯一

基于用户编码唯一原则,那么解决的方法有很多,这里我们通过锁定代码块的方式来解决,也就是同步机制来解决。
同步机制的最大特点就是,即使有多个请求同一时间调用同一个方法,它也会遵循一个一个执行完,从而用户编码也只会顺序叠加。

效果

  • 方法部分锁
int userCodeIndex = 0;
private void TargetData(int num)
{txtInfo.AppendText($"用户【{num}】进入方法,等待添加!\r\n");lock (this){userCodeIndex += 1;txtInfo.AppendText($"GZ{userCodeIndex.ToString().PadLeft(5, '0')}\r\n\r\n");}
}

在这里插入图片描述

  • 方法全部锁
int userCodeIndex = 0;
private void TargetData(int num)
{lock (this){txtInfo.AppendText($"用户【{num}】进入方法,等待添加!\r\n");userCodeIndex += 1;txtInfo.AppendText($"GZ{userCodeIndex.ToString().PadLeft(5, '0')}\r\n\r\n");}
}

在这里插入图片描述

代码

namespace XxxData
{/// <summary>/// 解决数据重复/// </summary>public partial class LockUser : Form{public LockUser(){InitializeComponent();CheckForIllegalCrossThreadCalls = false;}private void Form1_Load(object sender, EventArgs e){}int userCodeIndex = 0;private void TargetData(int num){lock (this){txtInfo.AppendText($"用户【{num}】进入方法,等待添加!\r\n");userCodeIndex += 1;txtInfo.AppendText($"GZ{userCodeIndex.ToString().PadLeft(5, '0')}\r\n\r\n");}}private void btnA_Click(object sender, EventArgs e){// ===模拟并发===// 用户并发a区域Task.Run(() =>{for(int i = 0; i < 10; i++){TargetData(i + 1);Thread.Sleep(10);}});// 用户并发b区域Task.Run(() =>{for (int i = 10; i < 20; i++){TargetData(i + 1);Thread.Sleep(10);}});// 用户并发c区域Task.Run(() =>{for (int i = 20; i < 30; i++){TargetData(i + 1);Thread.Sleep(10);}});}}
}

并发基本概念

C# 并发与方法和 API 接口请求之间有一些关联和区别:
1.并发方法调用:在 C# 中,可以使用多线程或任务并发地调用方法。这种方式适用于需要同时执行多个方法并获得结果的场景。通过多线程或任务的并发,可以提高系统的响应能力和吞吐量。

2.API 接口请求:API 接口请求是通过网络协议发送请求,获取相应的资源或执行操作。在 C# 中,可以使用异步或并发技术来发起多个 API 请求,以提高性能和并发处理能力。常见的方式包括使用异步/等待模式、多线程或任务并发等。

3.并发控制:并发方法调用和 API 接口请求都需要考虑并发控制的问题。在多个线程或任务同时访问共享资源时,可能会出现竞态条件等并发问题。C# 中提供了锁、互斥体、信号量等机制来实现并发控制,以确保共享资源的安全访问。

总结:温故而知新,不同阶段重温知识点,会有不一样的认识和理解,博主将巩固一遍知识点,并以实践方式和大家分享,若能有所帮助和收获,这将是博主最大的创作动力和荣幸。也期待认识更多优秀新老博主。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/591288.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

《数据库开发实践》之触发器【知识点罗列+例题演练】

一、什么是触发器&#xff1f; 1.概念&#xff1a; 简单来说触发器就是一种特殊的存储过程&#xff0c;在数据库服务器触发事件的时候会自动执行其SQL语句集。 2.构成四要素&#xff1a; &#xff08;1&#xff09;名称&#xff1a;要符合标识符命名规则 &#xff08;2&am…

idea中切换JDK8、JDK11、JDK17

有时候&#xff0c;我们可能需要在不同的Java版本中去测试或者查看源码&#xff0c;idea可以让我们修改Java的版本。 前提&#xff1a;你必须下载安装好对应的Java版本&#xff0c;可参考文章【windows下切换JDK8、JDK11、JDK17】&#xff08;https://blog.csdn.net/xijinno1/a…

口袋参谋:遇到差评怎么办?用好这3招方法,帮你全面规避差评!

​常在江湖飘&#xff0c;哪有不挨刀&#xff01; 至少99.999%的商家&#xff0c;都被差评折磨过&#xff01; 一个差评的威力&#xff0c;100%能让转化跌落到谷底&#xff01; 那如何处理差评&#xff1f;规避差评呢&#xff1f; 敲重点&#xff1a; 小本本记好&#xff…

JVM工作原理与实战(三):字节码文件的组成

专栏导航 JVM工作原理与实战 RabbitMQ入门指南 从零开始了解大数据 目录 专栏导航 前言 一、基础信息 1.Magic魔数 2.主副版本号 3.其他信息 二、常量池 1.案例解析 三、方法 1.方法介绍 2.案例解析 四、字段 五、属性 总结 前言 JVM作为Java程序的运行环境&…

第 6 章 统计量及其抽样分布

统计量 卡方分布&#xff0c;t分布&#xff0c;f分布 样本均值的抽样分布 中心极限定理 样本比例的的抽样分布 两个均值之差的抽样分布 样本方差的分布&#xff08;重要&#xff09; 两个样本方差比的分布 注意理解下面这个图里面的定义&#xff08;比较重要&#xff09…

2023年度十大科技名词发布:大语言模型、脑机接口在列

源自&#xff1a;IT之家 “人工智能技术与咨询” 发布 IT之家 12 月 26 日消息&#xff0c;据光明日报&#xff0c;全国科学技术名词审定委员会事务中心联合国家语言资源监测与研究平面媒体中心、蜜度微热点研究院、万方数据、百度百科、百度指数、《中国科技术语》杂志社等…

Java面向对象封装--学习笔记

面向对象三大特征&#xff1a;封装、继承、多态 什麽是封装&#xff1f; 就是用类设计对象处理某一个事务的数据时&#xff0c;应该把要处理的数据&#xff0c;以及处理这些数据的方法&#xff0c;设计到一个对象中去 用通俗一点的话来说就是设计对象时应该把要使用到…

服务雪崩简单的介绍

定义 服务雪崩效应是一种因“服务提供者的不可用”&#xff08;原因&#xff09;导致“服务调用者不可用”&#xff08;结果&#xff09;&#xff0c;并将不可用逐渐放大的现象。如下图所示&#xff1a; 上图中, A为服务提供者, B为A的服务调用者, C和D是B的服务调用者. 当A的…

浙大链协2023年终总结

2 0 2 4 元旦 快乐 龙腾虎跃 01 引言 俗话说&#xff1a;"币圈一天&#xff0c;人间十年"&#xff0c;数字货币一天的涨跌可能抵上其他资产价格一年的波动幅度。而经历过漫长的熊市后&#xff0c;铭文的火爆十分生动地表述了这一口号...... 2023年&#xff0c;浙大链…

针对工行的LockBit勒索软件攻击表明了全球金融系统对网络攻击的脆弱性

内容概要&#xff1a; 11月8日&#xff0c;工行一家美国子公司被勒索软件入侵导致美国国债交易业务瘫痪&#xff0c;暴露了全球金融系统易受网络攻击的脆弱性。LockBit勒索软件集团声称对工行的攻击负责。工行是世界上资产规模最大的银行&#xff0c;管理着5.7万亿美元。这一网…

前端学习笔记 3:Vue 工程

前端学习笔记 3&#xff1a;Vue 工程 上一篇文章介绍了如何在单一 Html 页面中使用 Vue&#xff0c;本文介绍如何从头开始用 Vue 构建一个前端工程项目。 环境准备 Vue 框架代码的创建依赖于 Node.js&#xff0c;因此需要先安装 Node.js。 创建和启动 创建 通过以下命令可…

Spring通信传参的方法

Spring通信传参的方法 目录概述需求&#xff1a; 设计思路实现思路分析1.简单参数传递2.复合参数3.动态参数 参考资料和推荐阅读 Survive by day and develop by night. talk for import biz , show your perfect code,full busy&#xff0c;skip hardness,make a better resul…

C#中字母与ASCⅡ码的转换

目录 一、关于ASCⅡ及与字符互转 1.主要用到Encoding对象的GetBytes方法 2.Char显式转换为数值类型得到ASCⅡ 二、实例 三、生成效果 四、程序中的一些知识点 1.IsLetterOrDigit() 2.GetBytes() 3.TryParse(string, out int) 一、关于ASCⅡ及与字符互转 ASCⅡ(Americ…

计算机网络的接口

计算机网络接口是计算机与网络通信设备之间进行通信的重要部分&#xff0c;它提供了计算机连接到网络的物理和逻辑接口&#xff0c;是计算机进行网络通信的重要组成部分。本文将介绍计算机网络接口的基本概念&#xff0c;不同类型的网络接口及其特点&#xff0c;以及在实际应用…

KBDNO1.DLL文件缺失,软件或游戏无法启动运行,怎样快速修复

不少小伙伴&#xff0c;求助电脑报错“KBDNO1.DLL文件缺失&#xff0c;软件或游戏无法启动或运行”&#xff0c;应该怎么办&#xff1f; 首先&#xff0c;我们先来了解“KBDNO1.DLL文件”是什么&#xff1f; KBDNO1.DLL是Windows操作系统中的一个动态链接库文件&#xff0c;主…

连接progressql报错Cannot load JDBC driver class ‘org.postgresql.Driver‘,亲测有效!!!

Jmeter连接progressql报错Cannot load JDBC driver class ‘org.postgresql.Driver’ 1.到官方下载驱动注意&#xff1a;根据项目的JDK版本来下载对应的驱动Download | pgJDBC 2.将postgresql-42.2.27.jar复制到lib目录下面&#xff0c; 然后重新启动 连接driver信息如下&#…

【LeetCode:69. x 的平方根 | 二分】

&#x1f680; 算法题 &#x1f680; &#x1f332; 算法刷题专栏 | 面试必备算法 | 面试高频算法 &#x1f340; &#x1f332; 越难的东西,越要努力坚持&#xff0c;因为它具有很高的价值&#xff0c;算法就是这样✨ &#x1f332; 作者简介&#xff1a;硕风和炜&#xff0c;…

印尼小胖子表情包大全

印尼小胖子tatan表情包大全 想要更多表情包&#xff0c;访问cmay表情包大全

二叉树的前序遍历 、二叉树的最大深度、平衡二叉树、二叉树遍历(leetcode)

目录 一、二叉树的前序遍历 方法一&#xff1a;全局变量记录节点个数 方法二&#xff1a;传址调用记录节点个数 二、二叉树的最大深度 三、平衡二叉树 四、二叉树遍历 一、二叉树的前序遍历 方法一&#xff1a;全局变量记录节点个数 计算树的节点数: 函数TreeSize用于递…

机器视觉在医学影像与医疗领域的应用及前景

引言 随着人工智能技术的飞速发展&#xff0c;机器视觉在医学影像和医疗领域中扮演着越来越重要的角色。机器视觉技术如何在医院领域提高诊断准确性、加快治疗流程以及改善患者体验。本文将探讨机器视觉算法的重要性、使用场景&#xff0c;并对其在医院领域应用的前景提出个人见…