首页 > 编程语言 >C#中volatile与lock用法

C#中volatile与lock用法

时间:2024-06-06 10:58:17浏览次数:22  
标签:C# lock 代码 用法 线程 volatile

C#中volatile与lock用法

 更新时间:2014年10月28日 14:28:52   投稿:shichen2014     这篇文章主要介绍了C#中volatile与lock用法,较为详细的分析了C#中volatile与lock的适用情况及用法实例,具有一定的参考借鉴价值,需要的朋友可以参考下  

本文实例讲述了C#中volatile与lock用法,分享给大家供大家参考。具体分析如下:

一、C#中volatile

volatile是C#中用于控制同步的关键字,其意义是针对程序中一些敏感数据,不允许多线程同时访问,保证数据在任何访问时刻,最多有一个线程访问,以保证数据的完整性,volatile是修饰变量的修饰符。

1、volatile的使用场景

多个线程同时访问一个变量,CLR为了效率,允许每个线程进行本地缓存,这就导致了变量的不一致性。volatile就是为了解决这个问题,volatile修饰的变量,不允许线程进行本地缓存,每个线程的读写都是直接操作在共享内存上,这就保证了变量始终具有一致性。

2、volatile 关键字可应用于以下类型的字段

① 引用类型

② 整型,如 sbyte、byte、short、ushort、int、uint、char、float 和 bool。

③ 具有整数基类型的枚举类型。

④ 已知为引用类型的泛型类型参数。

⑤ 不能将局部变量声明为 volatile。

二、C#中lock

1、lock 关键字将语句块标记为临界区,方法是获取给定对象的互斥锁,执行语句,然后释放该锁。此语句的形式如下:

 

复制代码代码如下: Object thisLock = new Object();
lock (thisLock)
{
    // Critical code section
}

 

2、lock确保当一个线程位于代码的临界区时,另一个线程不进入临界区。如果其他线程试图进入锁定的代码,则它就会被阻止,直到该对象被释放。也就是说在用到临界资源,确保线程可以排队进入执行临界区中的方法。

3、lock的使用场景

多个线程同时访问一个代码块,使用lock 修饰该代码块,强制多个线程进行排队,一个接一个的去访问。

通常,应避免锁定 public 类型,否则实例将超出代码的控制范围。最佳做法是定义 private 对象来锁定, 或 private static 对象变量来保护所有实例所共有的数据。

希望本文所述对大家的C#程序设计有所帮助。

您可能感兴趣的文章:

标签:C#,lock,代码,用法,线程,volatile
From: https://www.cnblogs.com/yyxone/p/18234687

相关文章

  • 电池电动汽车的健康状态 SOH 和充电状态 SOC 估计研究(Matlab代码实现)
      ......
  • el-select懒加载
    注册selectLoadmore指令   loadMore(){   //如果没有更多数据,则不请求   if(!this.hasMore){    return;   }   //如果intercept属性为true则不请求数据,   if(this.loadMore.intercept){    return; ......
  • 机器学习策略篇:详解如何改善你的模型的表现(Improving your model performance)
    如何改善模型的表现学过正交化,如何设立开发集和测试集,用人类水平错误率来估计贝叶斯错误率以及如何估计可避免偏差和方差。现在把它们全部组合起来写成一套指导方针,如何提高学习算法性能的指导方针。所以想要让一个监督学习算法达到实用,基本上希望或者假设可以完成两件事情。首......
  • BD10100CS-ASEMI肖特基二极管BD10100CS
    编辑:llBD10100CS-ASEMI肖特基二极管BD10100CS型号:BD10100CS品牌:ASEMI封装:TO-252最大平均正向电流(IF):10A最大循环峰值反向电压(VRRM):100V最大正向电压(VF):0.80V工作温度:-65°C~175°C芯片个数:2芯片尺寸:mil正向浪涌电流(IFMS):100ABD10100CS特性:低正向压降低功率损耗高效高浪......
  • spring入门aop和ioc基于注解
    目录用注解代替xml文件中的部分配置请先观看链接用注解代替xml文件中的部分配置在要注册bean的地方添加注解@Component()不指定名字就是类名的首字母小写@Component("name")bean的名字就是括号中指定的值在注册完以后要开始注册扫描<!--重点是开启注解扫描-->......
  • vue3+vueCli实现自动引入 unplugin-auto-import插件版本问题
    vue3项目引入unplugin-auto-import后报错通过引入的方式constAutoImport=require('unplugin-auto-import/webpack');报错如下: 通过直接官网vue-cli方式直接引入 报错如下经测试,是unplugin-auto-import插件版本问题查看unplugin-auto-import插件版本:npmlistu......
  • windows使用qt-mingw编译opencv4
    windows使用qt-mingw编译opencv4所需软件:cmake-guiqt工具链能正常使用git1.下载opencv源码2.cmake配置opencv2.1选择opencv源码目录和编译目录以opencv4.10为例。​​2.2配置cmake指定qt-mingw工具链点击configure。​​​​​​​​设置CMAKE_MAKE_PROGRAM......
  • CS8406国产兼容替代芯片DP7406数字音频I2S转SPDIF/AES3同轴输出芯片
    模拟音频传输VS数字音频传输模拟音频传输效果模拟音频传输特点:直观且容易实现,但相对会出现失真、不稳定的情况。数字音频传输效果数字音频传输特点:经过数字手段记录、存储、编辑、压缩或播放声音处理,采样率和量化等级越高,模数转换的精度就越高,对信号的还原能力就越强。D......
  • 穿透 wsl 和 ssh, 新版本 neovim 跨设备任意复制,copy anywhere!
    获得更好的阅读体验,欢迎查看原文:穿透wsl和ssh,新版本neovim跨设备任意复制,copyanywhere!1.创作动机最近一个星期,我入坑了neovim,然后开始配置各种插件。同一个时间点,我入手了一台surfacego2,这是个Windows平板,我在上面也是装好了各种软件,配置了wsl2,并且配置了......
  • Yii2 框架中,通过 yii\db\Command 对象来执行原生 SQL 语句
    在Yii2中,你可以通过yii\db\Command对象来执行原生SQL语句。这包括查询操作(如SELECT)和数据操作(如INSERT、UPDATE、DELETE)。以下是一些常见的例子,展示如何在Yii2中执行SQL语句。执行查询语句执行SELECT查询并获取结果你可以使用queryAll()、queryOne()、queryColu......