【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.mfbz.cn/a/285847.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

主浏览器优化之路2——Edge浏览器的卸载与旧版本的重新安装

Edge浏览器的卸载与旧版本的重新安装 引言开整寻找最年轻的她开始卸载原本的Edge工具下载后新版本的安装 结尾 引言 &#xff08;这个前奏有点长&#xff0c;但是其中有一些我的思考顿悟与标题的由来&#xff0c;望耐心&#xff09; 我在思考这个系列的时候 最让我陷入困得是…

python 深度学习 记录遇到的报错问题10

本篇继python 深度学习 解决遇到的报错问题9_module d2l.torch has no attribute train_ch3-CSDN博客 一、CUDA error: no kernel image is available for execution on the device CUDA kernel errors might be asynchronously reported at some other API call,so the stackt…

架构设计的核心:从多个维度理论分析

文章目录 一、如何实现高内聚低耦合的架构1、确定边界2、内聚的分类3、耦合的分类4、如何实现高内聚低耦合&#xff08;1&#xff09;耦合关注点&#xff08;2&#xff09;低耦合原则&#xff08;3&#xff09;高内聚原则 二、如何实现可扩展性的架构1、扩展性&#xff1a;核心…

机器人活动区域 - 华为OD统一考试

OD统一考试 题解: Java / Python / C++ 题目描述 现有一个机器人,可放置于 M x N 的网格中任意位置,每个网格包含一个非负整数编号,当相邻网格的数字编号差值的绝对值小于等于 1 时机器人可以在网格间移动。 问题: 求机器人可活动的最大范围对应的网格点数目。 说明: 网格…

G-LAB|2024年1月份最新的开班计划

1&#x1f237;最新的开班计划 &#x1f447;&#x1f447;&#x1f447; 思科华为HCIA、HCIP、红帽RHCE 可预约免费试听

C#/.NET/.NET Core推荐学习书籍(23年12月更新)

前言 古人云&#xff1a;“书中自有黄金屋&#xff0c;书中自有颜如玉”&#xff0c;说明了书籍的重要性。作为程序员&#xff0c;我们需要不断学习以提升自己的核心竞争力。以下是一些优秀的C#/.NET/.NET Core相关学习书籍&#xff0c;值得.NET开发者们学习和专研。书籍已分类…

微服务智慧工地信息化解决方案(IOT云平台源码)

智慧工地是指应用智能技术和互联网手段对施工现场进行管理和监控的一种工地管理模式。它利用传感器、监控摄像头、人工智能、大数据等技术&#xff0c;实现对施工现场的实时监测、数据分析和智能决策&#xff0c;以提高工地的安全性、效率和质量。 智慧工地平台是一种智慧型、系…

Linux 详解:最完整的入门指南

Linux 是当今最流行的操作系统&#xff0c;仅次于 Windows 和 MacOS。这个开源系统是免费的&#xff0c;在可靠性、安全性和灵活性方面有着悠久的历史。 由于Linux存在于许多设备中并带来了许多优势&#xff0c;因此了解它是什么以及它如何影响计算机行业是至关重要的。 本文…

一呼百应API实时获取商品详情的实现

一、引言 随着电子商务的飞速发展&#xff0c;快速准确地获取商品详情变得尤为重要。一呼百应作为一家知名的B2B采购平台&#xff0c;提供了丰富的商品信息和交易数据。通过一呼百应的API接口&#xff0c;开发者可以实时获取商品详情&#xff0c;为业务决策和数据分析提供有力…

D4145 为什么是交流电源插座接地故障中断器的低功率控制器,有什么作用?

D4145 是。 在发生有 害或致命冲击前&#xff0c;这些器件检测是否有危险的接地情况&#xff0c;比如设备( 与 AC 线路反相连接) 与水以及与裸露电线接触。内含一个 26V 齐纳并联稳压 器、 一个运算放大器和一个 SCR 驱动器。 D4145 新增了两个感测变压 器、一个整流桥、一个 S…

哨兵1号回波数据(L0级)FDBAQ压缩算法详解

本专栏目录: 全球SAR卫星大盘点与回波数据处理专栏目录-CSDN博客 1. 全球SAR卫星回波数据压缩算法统计 各国的SAR卫星的压缩算法按照时间轴排列如下: 可以看出传统的分块BAQ压缩算法(上图粉色)仍然是主流,哨兵1号其实也有传统的BAQ压缩模式。 本文介绍哨兵1号用的FDBAQ算…

如何使用Plex在Windows系统搭建个人媒体站点公网可访问

文章目录 1.前言2. Plex网站搭建2.1 Plex下载和安装2.2 Plex网页测试2.3 cpolar的安装和注册 3. 本地网页发布3.1 Cpolar云端设置3.2 Cpolar本地设置 4. 公网访问测试5. 结语 1.前言 用手机或者平板电脑看视频&#xff0c;已经算是生活中稀松平常的场景了&#xff0c;特别是各…

cocos creator + vscode debug

安装插件 安装插件&#xff1a;JavaScript Debugger 配置 7456 为本地cocos creator的启动端口 启动debug调试 选择对应的启动方式

Sift 图片匹配

1. 模式匹配结果 2. 结果的可视化 3. 基于我们找到的匹配猜测仿射变换 4. 调整findHomo的参数&#xff0c;寻找最好的一堆参数 5. 带着新的仿射变换的信息&#xff0c;筛选我们的匹配

Linux之下载安装

rpm包管理 rpm介绍 rpm用于互联网下载包的打包及安装工具&#xff0c;他包含在某些linux分发版本中。他生成具有.rpm扩展名的文件。RPM是RedHat Package Manager(RedHat软件包管理工具&#xff09;的缩写&#xff0c;类似windows的steup.exe。 rpm包的查询指令 查询已经安装…

新的centos7.9安装docker版本的jenkins2.436.1最新版本-前端项目发布(五)

更多ruoyi-nbcio功能请看演示系统 gitee源代码地址 前后端代码&#xff1a; https://gitee.com/nbacheng/ruoyi-nbcio 演示地址&#xff1a;RuoYi-Nbcio后台管理系统 更多nbcio-boot功能请看演示系统 gitee源代码地址 后端代码&#xff1a; https://gitee.com/nbacheng/n…

cache blocking

cache blocking miss rate 概念 miss 次数例子 每个缓存块能够一次性加载一整行的8个元素&#xff0c;而每行有n个元素&#xff0c;那么在初始加载时&#xff0c;每行都会有 n/8次不命中。这是因为每次加载一个缓存块&#xff0c;都可以覆盖一整行的8个元素&#xff0c;而每行…

诺派克ROPEX热封控制器维修RES-408/400VAC

德国希尔科诺派克ROPEX热封控制器维修型号包括&#xff1a;RES-401&#xff0c;RES-402&#xff0c;RES-403&#xff0c;RES-406&#xff0c;RES-407&#xff0c;RES-408&#xff0c;RES-409&#xff0c;RES-420&#xff0c;RES-440&#xff0c;MSW-2&#xff0c;PEX-W3&#x…

【Bug解决】Failed to configure a DataSource

1、问题描述 SpringBoot项目在启动时报出下面的错误&#xff1a; Description: Failed to configure a DataSource: url attribute is not specified and no embedded datasource could be configured. Reason: Failed to determine a suitable driver class Action: Consider…

自动化在线客服系统选择指南:关键要素与最佳实践分享

售后服务是企业整个运营流程的重要一环&#xff0c;而自动化在线客服系统又在售后服务中占据着举足轻重的位置。它为客户解决售后难题&#xff0c;帮助企业搭建完善高效的客户服务体系&#xff0c;在整个服务流程中发挥着巨大的作用。而市场上的客服系统厂家百花齐放&#xff0…