lock关键字
lock关键字
lock(this),只有一个线程可以修改对象的一个实例
存在的问题
1、对于Public对象的其他实例无法达到锁定效果。
lock(typeof(ClassName)),锁定了该对象的所有实例(即锁定类型对象)
存在的问题
1、得到类型对象实际上是一个很缓慢的过程
2、任何类中的其他线程、甚至在同一个应用程序域中运行的其他程序都可以访问该类型对象,因此,它们就有可能代替您锁定类型对象,完全阻止您的执行,从而导致您挂起。
lock("somestring")
存在的问题
Interlocked类专门为多个线程共享的变量提供原子操作(如果你想锁定的对象是基本数据类型,那么请使用这个类),CompareExchange方法将当前_syncRoot和null做比较,如果相等,就替换成new object(),这样做是为了保证多个线程在使用syncRoot时是线程安全的。
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 }
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时是线程安全的。