ppt做视频模板下载网站有哪些内容,中国工信部网站备案,东莞营销商城网站建设,动易网站管理系统下载一、概要本文主要讲解在c#中lock关键字的用法以及需要注意的坑。帮助大家避免使用不当造成的bug。作用#xff1a;lock 关键字可以用来确保代码块完成运行#xff0c;而不会被其他线程中断。它可以把一段代码定义为互斥段#xff08;critical p#xff09;#xff0c;互斥… 一、概要本文主要讲解在c#中lock关键字的用法以及需要注意的坑。帮助大家避免使用不当造成的bug。作用lock 关键字可以用来确保代码块完成运行而不会被其他线程中断。它可以把一段代码定义为互斥段critical p互斥段在一个时刻内只允许一个线程进入执行而其他线程必须等待。这是通过在代码块运行期间为给定对象获取互斥锁来实现的。在多线程中每个线程都有自己的资源但是代码区是共享的即每个线程都可以执行相同的函数。这可能带来的问题就是几个线程同时执行一个函数导致数据的混乱产生不可预料的结果因此我们必须避免这种情况的发生。缺点 多线程中频繁使用lock会造成性能损耗。二、详细内容1使用以下是lock在单例中使用的大家可以看到在Instance中有两个if判断_instance是否为空。为什么因为lock在执行的过程中会有性能损耗如果已经初始化过了之后就不要在走lock加锁了多线程中只读单例 对象是不会造成‘脏读’数据的。那么最外层的if就完美避免了lock的缺点。public class Demo1
{private static readonly object _lockObj new object();private static Demo1 _instance;public static Demo1 Instance{get{if (_instance null){lock (_lockObj){if (_instance null){_instance new Demo1();}}}return _instance;}}private Demo1() { }public Liststring GetData() {return new Liststring();}
}
2注意事项及原理2.1注意事项当同步对共享资源的线程访问时请锁定专用对象实例例如private readonly object balanceLock new object();或另一个不太可能被代码无关部分用作 lock 对象的实例。避免对不同的共享资源使用相同的 lock 对象实例因为这可能导致死锁或锁争用。具体而言避免将以下对象用作 lock 对象this调用方可能将其用作 lock。Type 实例可以通过 typeof 运算符或反射获取。字符串实例包括字符串文本这些可能是暂存的。尽可能缩短持有锁的时间以减少锁争用。在 lock 语句的正文中不能使用 await 运算符。2.2原理(以下内容比较浅显太深究内容一篇文章写不完)Q1大家会注意到为什么要在lock的圆括号里放一个引用类型object为什么不可以放一个值类型例如intA1因为如果使用了值类型例如int作为lock锁定的对象lock圆括号中的入参是object类型当传入了值类型会对传入的对象类型进行转换那么在IL层面会对值类型进行一次装箱box操作。那么这种情况下就不具备lock锁定需要用到专用对象的稳定性了。IL_0002:ldloc.0
IL_0003:box [mscorlib]System.Int32
A2第二个原因这个就需要追溯到“值类型”和“引用类型”的基类大家都知道引用类型的基类是object、值类型的基类是ValueType这两种基类本质的区别如下值类型构造中不包含同步块索引。引用类型构造中包含同步块索引。除了c#语法不支持以外它不适宜作为lock圆括号中的锁定对象的原因就是没有同步块索引。