C#___锁(lock)

lock是一种语言级别的关键字,用于实现线程同步和互斥。它提供了一种简单的方式来确保多个线程不会同时访问共享资源,从而避免竞争条件和数据不一致的问题。

作用:

1、避免并行运算中,共享数据的的读写安全问题;
2、并行执行时,在锁的位置只有一个程序可以获得锁,其他程序无法获得;
3、锁的出现使得并行执行得地方在锁的位置执行串行;

分类:

1:互斥锁

最常见的锁类型之一。它确保在任何时刻只有一个线程可以访问被保护的资源,其他线程必须等待锁的释放才能继续执行

2:读写锁

允许多个线程同时读取共享资源,但只有一个线程可以写入共享资源

3:自旋锁

一种忙等待的锁,当线程尝试获取锁时,如果发现锁已经被占用,它会一直循环等待直到锁可用

4:条件变量

5:信息量

举个官方的例子:

using System;
using System.Threading.Tasks;public class Account
{//账户余额锁private readonly object balanceLock = new object();//账户余额private decimal balance;public Account(decimal initialBalance) => balance = initialBalance;//扣除金额public decimal Debit(decimal amount){if (amount < 0){throw new ArgumentOutOfRangeException(nameof(amount), "The debit amount cannot be negative.");}decimal appliedAmount = 0;//确保多个线程不能同时修改余额lock (balanceLock){if (balance >= amount){balance -= amount;appliedAmount = amount;}}return appliedAmount;}//存入金额public void Credit(decimal amount){if (amount < 0){throw new ArgumentOutOfRangeException(nameof(amount), "The credit amount cannot be negative.");}lock (balanceLock){balance += amount;}}public decimal GetBalance(){lock (balanceLock){return balance;}}
}class AccountTest
{static async Task Main(){var account = new Account(1000);//创建100个任务并行对账户进行更新var tasks = new Task[100];for (int i = 0; i < tasks.Length; i++){tasks[i] = Task.Run(() => Update(account));}await Task.WhenAll(tasks);Console.WriteLine($"Account's balance is {account.GetBalance()}");// Output:// Account's balance is 2000}static void Update(Account account){decimal[] amounts = [0, 2, -3, 6, -2, -1, 8, -5, 11, -6];foreach (var amount in amounts){if (amount >= 0){account.Credit(amount);}else{account.Debit(Math.Abs(amount));}}}
}

对Blance进行加锁,然后创建100个Taks并行执行任务,保证在获取Balance的时候并不会线程之间混乱存取,保证秩序,当大于0的时候就存款,当小于0的时候就取款,所以最终结果就是2000

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

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

相关文章

文件上传漏洞-服务端检测

服务端检测 服务端检测就是网站对用户上传的文件的检测代码放置在服务器里&#xff0c;当用户上传的文件通过了检测才会被允许保存在服务器里。 MIME类型检测 MIME (Multipurpose Internet Mail Extensions) 是描述消息内容类型的因特网标准。用来表示文档、文件或字节流的…

第115讲:Mycat核心配置文件各项参数的作用以及概念

文章目录 1.Mycat配置文件相关概念2.Schema配置文件3.Rule配置文件4.Server配置文件 1.Mycat配置文件相关概念 在Mycat中核心的配置文件有schema.xml和rule.xml以及server.xml三个&#xff0c;其中schema.xml是用来配置数据库、表、读写分离、分片节点、分片规则等信息&#x…

精准营销的秘密:独立站如何通过大数据与AI技术实现个性化定制

在当今电商市场竞争激烈的背景下&#xff0c;电商行业逐渐步入个性化、精细化的运营时代。独立站作为电商领域的重要组成部分&#xff0c;其推广策略也在不断地进行创新与升级。个性化定制策略以其精准、高效的特点&#xff0c;正逐渐成为独立站推广的新宠。本文Nox聚星将和大家…

PostgreSQL关系型数据库介绍与部署

使用背景 在过去的几年中&#xff0c;PostgreSQL的使用量逐渐增加&#xff0c;而Oracle和MySQL的使用量则有所下降。这主要是由于以下几个原因&#xff1a;开源和免费、功能丰富、可扩展性强、安全性高、跨平台支持好、社区活跃、成熟稳定。这些因素使得PostgreSQL成为了许多开…

二、数据库管理员密码管理

1.6 为数据库设置密码 1&#xff09;数据库的管理员是 root &#xff0c; 5.5 默认没密码&#xff0c;必须设置一个密码。 ##修改管理员root的密码为oldboy123 [rootoldboy ~]# mysqladmin password oldboy123 ##尝试不用密码登录&#xff0c;发现被拒绝了 [rootoldboy ~]# m…

针对COT控制模式下低ESR电容造成次谐波振荡问题的片内斜波补偿方案

COT模式&#xff1a;MOS管固定导通时间控制模式&#xff0c;关断时间由输出反馈电压与内部基准源的相较值决定。 RBCOT控制模式&#xff1a;Ripple-Based COT基于纹波的固定导通时间控制方法&#xff0c;特别的是环路控制部分主要有固定导通时间发生装置及比较器组成。RBCOT控…

Java:反射 reflection ( 概念+相关类+使用方法)

文章目录 一、反射(reflection)1.概念优点&#xff1a;缺点 2.反射的相关类1.Class类1.**反射机制的起源**2.获得类相关的方法3.获得类中属性的相关方法4.获得类中注解相关的方法5.获得类中构造器相关的方法6.获得类中方法相关的方法 2.获取Class对象的三种方法&#xff1a;1.使…

剑指Offer题目笔记19(二分查找)

面试题68&#xff1a; 问题&#xff1a; ​ 输入一个排序的整形数组nums和一个目标值t&#xff0c;如果数组nums中包含t&#xff0c;则返回在数组中的下标&#xff0c;否则返回按照顺序插入到数组的下标。 解决方案&#xff1a; ​ 使用二分查找。每次二分查找都选取位于数组…

Days 35 ElfBoard板对Java的支持

Java作为一种功能强大且广泛应用的编程语言&#xff0c;具有广泛的适应性和实用性。在ELF 1开发板上集成Java支持&#xff0c;无疑将赋予嵌入式开发者更广阔的选择空间&#xff0c;今天就为各位小伙伴详细解析如何在ELF 1开发板上成功部署和运行Java环境。 1.拷贝两个压缩包到E…

代码随想录三刷day36

提示&#xff1a;文章写完后&#xff0c;目录可以自动生成&#xff0c;如何生成可参考右边的帮助文档 文章目录 前言一、力扣416. 分割等和子集二、力扣1049. 最后一块石头的重量 II三、力扣494. 目标和四、力扣474. 一和零 前言 有N件物品和一个最多能背重量为W的背包。第i件物…

国内IP代理手机软件推荐:功能、选择与使用指南

在移动互联网日益普及的今天&#xff0c;手机已经成为我们生活中不可或缺的一部分。而在使用手机上网的过程中&#xff0c;有时我们可能需要改变或隐藏自己的IP地址&#xff0c;以满足特定的网络需求或提高安全性。这时&#xff0c;国内IP代理手机软件便成为了一个重要的工具。…

基于SpringBoot+Vue+Mybatis的408刷题小程序管理端

简介 原始数据&#xff1a;书目信息、章节信息、题目信息、系统菜单、系统角色、系统用户。 主要任务&#xff1a;系统主要采用spring boot作为后端框架&#xff0c;前端使用vueelementUI&#xff0c;为408刷题小程序提供一个方面的管理和维护的任务&#xff0c;主要功能包括…

IS-IS路由

概览&#xff1a; Intermediate System-to-Intermediate System&#xff0c;中间系统到中间系统协议 IS-IS--IGP--链路状态协议--AD值&#xff1a;115 IS--中间系统&#xff08;路由器&#xff09; ES--终端系统&#xff08;PC&#xff09; 在早期IS-IS的开发并不是为了IP…

C语言在线编译器:无需安装,轻松编写C语言程序

C语言在线编译器&#xff1a;无需安装&#xff0c;轻松编写C语言程序 当今&#xff0c;C语言是一种非常流行的编程语言&#xff0c;被广泛用于系统开发、游戏开发等领域。为了方便学习和实践C语言&#xff0c;许多在线编译器应运而生&#xff0c;其中有些还提供了额外的功能&am…

学成在线day06

上传视频&#xff1a; 对文件进行分块 Testpublic void testChunk() throws IOException {File sourceFile new File("d:/ev/20240302_170705.mp4");String chunkPath "d:/ev/chunk/";File chunkFolder new File(chunkPath);if (!chunkFolder.exists(…

Python学习之-正则表达式

目录 前言&#xff1a;1.re.serach1.1例子&#xff1a; 2.re.match2.1示例1&#xff1a;2.2 示例2&#xff1a; 3.re.findall3.1 示例 4.re.fullmatch4.1 示例1&#xff1a;4.2 示例2: 5.re.split5.1 示例1:5.2 示例2&#xff1a;5.3 示例3&#xff1a; 6.re.sub6.1 示例&#…

vue3+Vite+TS项目,配置ESlint和Prettier

创建vue3项目 实操过的有两种方式 1.vue脚手架2.vite&#xff08;推荐&#xff0c;也是尤大大团队研发&#xff09; 具体怎么新建一个vue3项目就不多讲了&#xff0c;可以按照官方文档来 创建后的文件目录长这样 多提一句&#xff0c;vite也会随着时间不断迭代&#xff0c;后…

【绘图案例-自定义进度条 Objective-C语言】

一、好,我们接着来说这个自定义进度条 1.这个Slider啊,简单的这个value属性,介绍完了,以后,监听也可以监听的到了,接下来,我们来做这个自定义进度条啊, 那么,首先啊,我是这么想的,在这个slider的最小值、和、最大值、我给它改成0、到、1、 因为如果这样的话,到时候…

安装 使用 ida pro linux

安装 ida pro linux 下载地址 下载解压文件&#xff0c;然后linux下直接双击安装 ida7.5demo*******.run这个安装包 然后查找安装目录&#xff0c;一般桌面图标都有对应执行程序的路径 将crack包中的内容覆盖到这个安装目录中 然后双击执行就可以正常运行&#xff0c;new 打…

安装 allure 时踩到的坑:ERROR: JAVA_HOME is set to an invalid directory

报错内容是&#xff1a; 安装 allure 时ERROR: JAVA_HOME is set to an invalid directory: F:\soft\jdk Please set the JAVA_HOME variable in your environment to match the location of your Java installation。 这个问题的原因是java环境的环境变量不能运行 也就是在cm…