C#中实现线程同步lock关键字的用法详解
1.lock关键字保证一个代码块在执行的过程中不会受到其他线程的干扰,这是通过在该代码块的运行过程中对特定的对象加互斥锁来实现的。
2.lock关键字的参数必须是引用类型的对象。lock对基本数据类型如int,long等无效,因为它所作用的类型必须是对象。如果传入long类型数据,势必被转换为Int64结构类型,则加锁的是全新的对象引用。如果需要对它们进行互斥访问限制,可以使用System.Threading.Interlocked类提供的方法,这个类是提供原子操作的。
3.lock(this)的使用要慎重。共有类型中使用lock(this),如果新的对象被创建并加锁,极易造成死锁。
4.锁定ICollection类型对象时,应lock其SyncRoot属性。
SyncRoot属性在接口ICollection中声明,其实现方式各不相同。
例如在Collection(System.Collections.ObjectModel)中实现如下:
objectICollection.SyncRoot
{
get
{
if(this._syncRoot==null)
{
ICollectionitems=this.itemsasICollection;
if(items!=null)
{
this._syncRoot=items.SyncRoot;
}
else
{
Interlocked.CompareExchange(refthis._syncRoot,newobject(),null);
}
}
returnthis._syncRoot;
}
}
而在List<T>,ArrayList等类中实现如下:
objectICollection.SyncRoot
{
get
{
if(this._syncRoot==null)
{
Interlocked.CompareExchange(refthis._syncRoot,newobject(),null);
}
returnthis._syncRoot;
}
}
在Array类中则直接返回了this:
publicobjectSyncRoot
{
get
{
returnthis;
}
}
5.lock关键字是用Monitor(管程)类实现的
lock(x)
{
DoSomething();
}
System.Objectobj=(System.Object)x;
System.Threading.Monitor.Enter(obj);
try
{
DoSomething();
}
finally
{
System.Threading.Monitor.Exit(obj);
}
以上两段代码是等效的。(MSDN)
使用lock关键字相对于Monitor类在使用上更简单,也更加保险。
热门推荐
1 如何训练狗狗不叫
2 训练狗狗不叫
3 训练狗狗随行
4 怎么训练狗狗不叫
7 训练比熊狗狗教程
10 上海狗狗训练
11 怎么训练狗狗上厕所
12 训练狗狗趴下
13 狗狗服从训练
14 训练狗狗拒食
15 训练狗狗笑
16 训练狗狗大便
17 训练狗狗立
18 训练狗狗捡东西