>可以把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")是一样的效果

建议的使用是单独用一个成员来做为锁对象就可以解决上面的问题

最新文章

  1. C# 中反射获取某类的子类和根据类型名动态创建对象
  2. Tomcat在Linux上的安装与配置
  3. ERROR 2002 (HY000): Can’t connect to local MySQL server through socket ‘/var mysql 启动不了
  4. 通过自己技能把某个网站的ppt全部下载下来的过程
  5. JavaScript系列:event.bubbles属性(并不是所有的事件都具有冒泡)
  6. ASP.NET MVC 上传大文件时404
  7. 关于VS中更改栈和堆空间的大小
  8. 瀑布流ListView
  9. HTML5 乱记
  10. C和BlockCode
  11. HSF服务的开发与使用
  12. 用golang chromedp 操作已经打开的chrome浏览器
  13. Linux学习之Vim/Vi使用(十三)
  14. Android.mk使用第三方库方法
  15. lua-resty-gearman模块
  16. Mapreduce -- PageRank
  17. 小议 html 实体解析
  18. JAVA Zero Copy的相关知识【转】
  19. MySQL数据库----函数
  20. HDUOJ----最少拦截系统

热门文章

  1. 08.安装Oracle 10g和SQLServer2008(仅作学习使用VirtualBox虚拟机来安装节省电脑资源)
  2. poj 1556 (Dijkstra + Geometry 线段相交)
  3. Codeforces Round #382 (Div. 2) D. Taxes 歌德巴赫猜想
  4. Windows Internals学习笔记(五)Synchronization
  5. 再学C++之C++中的全部关键字
  6. 讓 SourceTree 讀取自定的 SSH key
  7. c How to Make an Ascii Picture.
  8. Android_使用 OpenVPN
  9. [转载] Linux 文件系统结构介绍
  10. ElasticSearch(ES)和solr的关系和区别