笨笨.Net

导航

lock关键字

lock关键字
lock(this),只有一个线程可以修改对象的一个实例
存在的问题
1、对于Public对象的其他实例无法达到锁定效果。
lock(typeof(ClassName)),锁定了该对象的所有实例(即锁定类型对象)
存在的问题
1、得到类型对象实际上是一个很缓慢的过程
2、任何类中的其他线程、甚至在同一个应用程序域中运行的其他程序都可以访问该类型对象,因此,它们就有可能代替您锁定类型对象,完全阻止您的执行,从而导致您挂起。
lock("somestring")
存在的问题

1、.NET中,字符串会被暂时存放,如果锁定的字符串内容相同,就可能引起程序挂起。

 

最好的方法是锁定Private Static对象,具体实现代码
 1 private static object _syncRoot;
 2 private static object SyncRoot{
 3   get{
 4     if (this._syncRoot == null)
 5         {            
 6             Interlocked.CompareExchange(ref this._syncRoot, new object(), null);
 7         }
 8         return this._syncRoot;
 9   }
10 }
11 public void SomeMethod()
12 {
13     lock (this.SyncRoot)
14     {
15         //some code
16     }
17 }

Interlocked类专门为多个线程共享的变量提供原子操作(如果你想锁定的对象是基本数据类型,那么请使用这个类),CompareExchange方法将当前_syncRoot和null做比较,如果相等,就替换成new object(),这样做是为了保证多个线程在使用syncRoot时是线程安全的。

posted on 2010-02-03 13:30  笨笨.Net  阅读(1973)  评论(0编辑  收藏  举报