lock关键字理解
>可以把lock关键字可以看成
try{
Monitor.Enter(x);
//..
}
finally{
Monitor.Exit(x);
}
这样子的结构,当然使用lock关键字更方便
>容易混淆的lock(对象)
这个里面的锁对象很容易搞混淆,下面区别一下lock(this),lock(typeof(tt)),lock("a")
1)lock(this) 下面代码
public class A{
public void Foo(){
lock(this){
//...
}
}
}
如果是A的同一个对象,开多个线程调用Foo方法,是没有问题的,如下面代码
A a=new A();
int count=;
while(count-->){
Task.Factory.StartNew(a.Foo);
}
但是下面代码就会出错
int count=
while(count-->){
A a=new A();
Task.Factory.StartNew(a.Foo);
}
因为这里lock的是A的对象本身,所以等于没有锁.其实在代码多数情况应该是后面一种,因为多个线程同一般情况下来自不同调用同一个类里的方法,比如多个用户同时在线操作.
2)lock("a"),lock((object)1) 其实这里不是一类,是两类
把这种看成lock一个值吧.这种在自己写测试的时候看不出效果,像lock("a")这个加到上面个例子里是实全可以实现效果的,因为C#对字符串做了缓存,只要在这个驻留池里面有的字符,它是不会再创建对象的,比如 string a="a";string b="a";这两句运行后a,b两个引用指向同一个字符串.所以我们的lock("a")永远都会有锁定效果,但是就会带一个问题 ,如果有两个方法这样写就会出问题了,也就是运行另一个方法时把运行当前这个方法线程也阻塞了.
而lock(object)1这个就是永远都没有效果的做法,因为每次都是int类型的一个装箱,不同的对象.
3)lock(typeof(tt))
因为typeof(tt)得出的对象引用都是同一个引用,所以同刚才那个lock("a")是一样的效果
建议的使用是单独用一个成员来做为锁对象就可以解决上面的问题
lock关键字理解的更多相关文章
- C# lock 关键字的一些理解
C# lock 关键字的一些理解 问题1:谁是锁? lock 这个关键字,并不是“锁”,真正的“锁”是那个被lock的Object类型的“对象”,请注意,这里为“对象”加了双引号着重强调被lock的是 ...
- C#中的lock关键字有何作用
作为C#的程序员来说,在遇到线程同步的需求时最常用的就是lock关键字.但如何正确并有效地使用lock,却是能否高效地达到同步要求的关键.正因为如此,程序员需要完全理解lock究竟为程序做了什么. 所 ...
- 锁·——lock关键字详解
作 者:刘铁猛 日 期:2005-12-25 关键字:lock 多线程 同步 小序 锁者,lock关键字也.市面上的书虽然多,但仔细介绍这个keyword的书太少了.MSDN里有,但所给的代码非常 ...
- 《C#多线程编程实战》1.10 lock关键字
lock关键字是锁定资源用的. 书上的代码解释很好. /// <summary> /// 抽象类 加减法 /// </summary> abstract class Count ...
- lock关键字的使用
最近在代码中,发现别人使用了lock关键字,为了理解别人写的代码,所以自己对lock关键字的使用研究了下. 微软官方解释,请百度:lock 语句(C# 参考) 微软给了个官网实例代码: class A ...
- 带你轻松了解C# Lock 关键字
相信绝大多数.NET玩家和我一样,常常使用Timer这个对象,而在WPF中使用DispatcherTimer的人也是很多,DispatcherTimer是在UI线程跑的.我们的程序中大多数都会充斥很多 ...
- lock关键字只不过是C#提供的语法糖
lock关键字只不过是C#提供的语法糖, 最终使用的还是Monitor类. Monitor类的Enter方法要求传入的参数不为null, 否则会有ArgumentNullException excep ...
- C#的lock关键字
using System; using System.Threading; namespace Test { class Program { //一.Lock定义 //lock 关键字可以用来确保代码 ...
- C# 使用lock关键字lock不同的对象
c# lock关键字的本质 是调用Monitor.Enter(object obj)并且在finally的时候调用Monitor.Exit(obj) 在obj是不同数据类型的时候会出现不同的情况 1. ...
随机推荐
- Timeout expired超时时间已到. 达到了最大池大小 错误及Max Pool Size设置
此文章非原创,仅为分享.学习!!! 参考数据库链接串: <add key="data" value="server=192.168.1.123; port=3306 ...
- 迪米特法则(LoD),即最少知识原则
解释: 如果两个类不必彼此直接通信,那么这两个类就不应当发生直接的相互作用.如果其中一个类需要调用另一个类的某一个方法的话,可以通过第三者转发这个调用. 重点: 在类的结构上,每个类都应当尽量降低成员 ...
- 关于【bootstrap modal 模态框弹出瞬间消失的问题】
前提是你没有重复引入bootstrap.js\bootstrap.min.js和modal.js.一下提供一个小例子. <button class="btnbtn-primary bt ...
- 2013年5月~2013年11月份(转接关于ns51服务平台项目)相关资料:
<1> [平台首页] 界面截图:(网络游客所看到的界面首页) <2>[注册] 有需求则注册会员(略...) <3>[个人空间] 注册成功后进入个人空间(有深层次的需 ...
- Redis基础知识之————php-Redis 常用命令专题
Keys del,delete - 删除键 dump - 返回存储在指定键值的序列化版本. exists - 确定键是否存在 expire,setTimeout,pexpire - 设置键的生存时间( ...
- 一个不错的能将HTML表格导出为excel,pdf等的jquery插件
https://github.com/kayalshri/tableExport.jquery.plugin https://github.com/kayalshri/ tableExport.jqu ...
- mysql概要(三)having
1.运算符 2.模糊查询 3.where 后的判断基于表(表的直接内容),而不是基于结果(运算之后的别名)如: 可改成在where后再次重新计算判断: 或者使用having对结果判断: having多 ...
- MonkeyRunner学习(1)测试连接
前期的环境搭建详见:http://www.cnblogs.com/peng-lan/p/5388488.html 1.打开模拟器 打开模拟器有两种方法,正常的在eclipse 中启动就不介绍了 另一种 ...
- eclipse xml 注释快捷键
注释:CTRL + SHIFT + / 撤销注释:CTRL + SHIFT + \
- HTTP POST GET 本质区别详解
HTTP POST GET 本质区别详解 一 原理区别 一般在浏览器中输入网址访问资源都是通过GET方式:在FORM提交中,可以通过Method指定提交方式为GET或者POST,默认为GET提交 Ht ...