浅谈C#之线程锁

一、基本介绍

        锁是一种同步机制,用于控制多个线程对共享资源的访问。当一个线程获得了锁时,其他线程将被阻塞,直到该线程释放了锁。

        在并发编程中,多个线程同时访问共享资源可能导致数据竞争和不确定的行为。锁可以确保在任意时刻只有一个线程可以访问共享资源,从而避免竞态条件和数据不一致性问题。        

二、锁的作用原理

        锁的作用原理通常涉及到内部的互斥机制。当一个线程获得锁时,它会将锁标记为已被占用,其他线程尝试获取该锁时会被阻塞,直到持有锁的线程释放锁。这种互斥机制可以通过不同的算法和数据结构来实现,如互斥量、自旋锁等。

三、常用的线程锁机制

1. lock 语句

lock 语句是C#中最基本的同步机制,它使用一个对象作为锁(通常称为“锁对象”),确保同一时间只有一个线程可以执行锁定代码块。

using System;
using System.Threading;class Program
{static object lockObject = new object();static int sharedResource = 0;static void Main(){Thread thread1 = new Thread(Increment);Thread thread2 = new Thread(Increment);thread1.Start();thread2.Start();thread1.Join();thread2.Join();Console.WriteLine($"Final value: {sharedResource}");}static void Increment(){for (int i = 0; i < 10000; i++){lock (lockObject){sharedResource++;}}}
}

2. Monitor 类

Monitor 类提供了更灵活的锁定机制,它允许等待、通知和超时等高级功能。

using System;
using System.Threading;class Program
{static object lockObject = new object();static int sharedResource = 0;static void Main(){Thread thread1 = new Thread(Increment);Thread thread2 = new Thread(Increment);thread1.Start();thread2.Start();thread1.Join();thread2.Join();Console.WriteLine($"Final value: {sharedResource}");}static void Increment(){for (int i = 0; i < 10000; i++){bool lockTaken = false;try{Monitor.Enter(lockObject, ref lockTaken);sharedResource++;}finally{if (lockTaken){Monitor.Exit(lockObject);}}}}
}

3. Mutex 类

Mutex 类是一种跨进程的同步机制,但它也可以用于线程同步。Mutex 可以被不同的进程或线程持有。

using System;
using System.Threading;class Program
{static Mutex mutex = new Mutex();static void Main(){Thread thread1 = new Thread(Increment);Thread thread2 = new Thread(Increment);thread1.Start();thread2.Start();thread1.Join();thread2.Join();Console.WriteLine($"Final value: {sharedResource}");}static int sharedResource = 0;static void Increment(){for (int i = 0; i < 10000; i++){bool lockTaken = false;try{mutex.WaitOne(); // 请求锁lockTaken = true;sharedResource++;}finally{if (lockTaken){mutex.ReleaseMutex(); // 释放锁}}}}
}

4. Semaphore 类

Semaphore 类允许多个线程同时访问资源,但它限制了同时访问的最大线程数。

using System;
using System.Threading;class Program
{static Semaphore semaphore = new Semaphore(1, 1);static int sharedResource = 0;static void Main(){Thread thread1 = new Thread(Increment);Thread thread2 = new Thread(Increment);thread1.Start();thread2.Start();thread1.Join();thread2.Join();Console.WriteLine($"Final value: {sharedResource}");}static void Increment(){for (int i = 0; i < 10000; i++){semaphore.WaitOne(); // 请求信号量try{sharedResource++;}finally{semaphore.Release(); // 释放信号量}}}
}

5. ReaderWriterLockSlim 类

ReaderWriterLockSlim 类提供了一种机制,允许多个读者同时访问资源,但写者在写入时会独占访问。

using System;
using System.Threading;class Program
{static ReaderWriterLockSlim rwLock = new ReaderWriterLockSlim();static int sharedResource = 0;static void Main(){Thread reader1 = new Thread(Read);Thread reader2 = new Thread(Read);Thread writer = new Thread(Write);reader1.Start();reader2.Start();writer.Start();reader1.Join();reader2.Join();writer.Join();Console.WriteLine($"Final value: {sharedResource}");}static void Read(){rwLock.EnterReadLock();try{Console.WriteLine($"Reader reading: {sharedResource}");}finally{rwLock.ExitReadLock();}}static void Write(){rwLock.EnterWriteLock();try{sharedResource++;Console.WriteLine($"Writer updated: {sharedResource}");}finally{rwLock.ExitWriteLock();}}
}

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

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

相关文章

springboot提升-多数据源配置

文章目录 1. 添加依赖2. 配置数据源示例配置&#xff1a; 3. 创建数据源 Bean4. 创建动态数据源5. 配置 MyBatis SqlSessionFactory6. 在业务代码中使用注意事项 在 Spring Boot 中配置 MyBatis 以支持多数据源涉及几个关键步骤&#xff0c;包括配置数据源、集成 MyBatis 以及动…

Qt篇——Qt使用C++获取Windows电脑上所有外接设备的名称、物理端口位置等信息

我之前有发过一篇文章《Qt篇——获取Windows系统上插入的串口设备的物理序号》&#xff0c;文章中主要获取的是插入的USB串口设备的物理序号&#xff1b;而本篇文章则进行拓展&#xff0c;可以获取所有外接设备的相关信息&#xff08;比如USB摄像头、USB蓝牙、USB网卡、其它一些…

Android 蓝牙三方和动态权限三方

记录一下最近用到的简单的框架 蓝牙 FastBle&#xff1a;Android BLE通信库的介绍与高级用法 - 简书 https://github.com/Jasonchenlijian/FastBle 动态权限: GitHub - googlesamples/easypermissions: Simplify Android M system permissions 位置权限举例,arrayOf中多…

Spring 源码解读:使用FactoryBean创建复杂对象的实现

引言 在Spring框架中&#xff0c;FactoryBean是一个特殊的Bean&#xff0c;它允许开发者通过实现FactoryBean接口来控制Bean的创建过程&#xff0c;特别适用于创建复杂对象。FactoryBean可以将复杂对象的创建逻辑与业务逻辑分离&#xff0c;提供更高的灵活性和可扩展性。在本篇…

分布式技术概览

文章目录 分布式技术1. 分布式数据库&#xff08;Distributed Databases&#xff09;2. 分布式文件系统&#xff08;Distributed File Systems&#xff09;3. 分布式哈希表&#xff08;Distributed Hash Tables, DHTs&#xff09;4. 分布式缓存&#xff08;Distributed Caching…

代码随想录打卡Day28

今天的题目还是感觉有难度&#xff0c;前三道题都想不出来思路&#xff0c;直接看讲解去了。。。贪心的难题真的好难想出来。 122.买卖股票的最佳时机II 这道题用贪心解很巧妙。涉及到一个数学技巧&#xff0c;从第i天买入&#xff0c;第j天卖出&#xff0c;所获得的利润为pr…

面试必问:Java 类加载过程

java 类加载过程主要分为加载、链接和初始化三个阶段&#xff0c;六个关键步骤&#xff1a;加载、验证、准备、解析、初始化。 加载阶段&#xff08;Loading&#xff09; 加载时类加载的第一个过程&#xff0c;在这个阶段&#xff0c;将完成以下三件事情&#xff1a; 1&#…

基于Springboot的鲜花销售网站的设计与实现

项目描述 这是一款基于Springboot的鲜花销售网站的系统 模块描述 鲜花销售系统 1、用户 登录 在线注册 浏览商品 鲜花搜索 订购商品 查询商品详情 水果分类查看 水果加购物车 下单结算 填写收货地址 2、管理员 登录 用户管理 商品管理 订单管理 账户管理 截图

项目经理应该学习pmp还是cspm?

职场竞争激烈&#xff0c;项目管理专业人才在各个行业中的作用越来越凸显出来。在23年之前&#xff0c;我国关于通用项目管理人才的培养更多依赖于国外的PMP认证&#xff0c;缺少自主的认证评价标准和体系。 为了弥补这一空缺&#xff0c;基于国内的项目管理发展需求&#xff…

西门子博途零基础学PLC必会的100个指令

#西门子##PLC##自动化##工业自动化##编程##电工##西门子PLC##工业##制造业##数字化##电气##工程师# 工控人加入PLC工业自动化精英社群 工控人加入PLC工业自动化精英社群

OpenMV——色块追踪

Python知识&#xff1a; 1.给Python的列表赋值&#xff1a; 定义一个元组时就是 元组a (1,2,…) 元组中可以只有一个元素&#xff0c;但是就必须要加一个 “ , ” 如 a (2,) 而列表的定义和元组类似&#xff0c;只是把()换成[]: #那么下面的colour_1 ~ 3属于元组&#xf…

(计算机网络)运输层

一.运输层的作用 运输层&#xff1a;负责将数据统一的交给网络层 实质&#xff1a;进程在通信 TCP&#xff08;有反馈&#xff09;UDP&#xff08;无反馈&#xff09; 二.复用和分用 三. TCP和UDP的特点和区别 进程号--不是固定的 端口号固定--mysql--3306 端口--通信的终点 …

苹果的“AI茅”之路只走了一半

今年苹果发布会最大的亮点&#xff0c;也许是和华为“撞档”&#xff0c;又或者是替腾讯“发布”新手游&#xff0c;但肯定不是iPhone 16。 9月10日&#xff0c;苹果秋季新品发布会与华为见非凡品牌盛典相继举行&#xff0c;iPhone 16系列也与HUAWEI Mate XT同日发布。 不过&…

传统CV算法——特征匹配算法

Brute-Force蛮力匹配 Brute-Force蛮力匹配是一种简单直接的模式识别方法&#xff0c;经常用于计算机视觉和数字图像处理领域中的特征匹配。该方法通过逐一比较目标图像中的所有特征点与源图像中的特征点来寻找最佳匹配。这种方法的主要步骤包括&#xff1a; 特征提取&#xff…

js中【微任务】和【宏任务】长篇解读

在 JavaScript 中&#xff0c;理解微任务&#xff08;microtasks)和宏任务 (macrotasks)是掌握异步编程和事件循环&#xff08;Event Loop&#xff09;机制的关键。这两个概念影响了代码的执行顺序&#xff0c;特别是在涉及异步操作&#xff08;如 setTimeout、Promise、async/…

postgres--系统视图,表

pg_stat_all_tables 累积统计系统-监控数据库活动 pg_stat_all_tables是一个系统视图&#xff0c;它为当前数据库中的每个表&#xff08;包括TOAST表&#xff09;提供一行数据。显示了关于特定表的访问统计信息&#xff0c;比如访问次数等。pg_stat_user_tables和pg_stat_sys_…

根据NVeloDocx Word模板引擎生成Word(三)

基于永久免费开放的《E6低代码开发平台》的Word模版引擎NVeloDocx&#xff0c;实现根据Word模版生成Word文件&#xff0c;前面2篇已经非常详细介绍了《主表单字段》&#xff0c;《子表记录循环输入到表格》。那这一篇我们就介绍插入单张图片、二维码&#xff0c;条形码等等&…

python-网页自动化(三)

如果遇到使用 ajax 加载的网页&#xff0c;页面元素可能不是同时加载出来的&#xff0c;这个时候尝试在 get 方法执行完 成时获取网页源代码可能并非浏览器完全加载完成的页面。所以&#xff0c;这种情况下需要设置延时等待一定时间&#xff0c;确保全部节点都加载出来。 那么&…

邦飞利减速机有哪些系列

邦飞利减速机拥有多个系列&#xff0c;以满足不同领域和场景的需求。以下是邦飞利减速机的一些主要系列&#xff1a; W系列蜗轮蜗杆减速机&#xff1a; 如W63、W75、W86、W110等型号&#xff0c;广泛应用于各种需要减速传动的设备中。VF系列微型蜗轮蜗杆减速机&#xff1a; 包…

搜维尔科技:AcuMap - 针灸模拟VR训练解决方案

AcuMap第一个针灸VR训练解决方案。全面且医学上准确的人体映射&#xff0c;其中 14 条经络和 361 个穴位以 3D 形式可视化。您还可以在虚拟人体模型上模拟针刺。主要特点 - 可视化 14 条经络及其分支 - 基于 4 个主要类别的 361 个穴位&#xff1a;五行、危险穴位、补邪和特殊穴…