手机
当前位置:查字典教程网 >编程开发 >C#教程 >C#中实现线程同步lock关键字的用法详解
C#中实现线程同步lock关键字的用法详解
摘要:1.lock关键字保证一个代码块在执行的过程中不会受到其他线程的干扰,这是通过在该代码块的运行过程中对特定的对象加互斥锁来实现的。2.loc...

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)中实现如下:

object ICollection.SyncRoot { get { if (this._syncRoot == null) { ICollection items = this.items as ICollection; if (items != null) { this._syncRoot = items.SyncRoot; } else { Interlocked.CompareExchange(ref this._syncRoot, new object(), null); } } return this._syncRoot; } }

而在List<T>,ArrayList等类中实现如下:

object ICollection.SyncRoot { get { if (this._syncRoot == null) { Interlocked.CompareExchange(ref this._syncRoot, new object(), null); } return this._syncRoot; } }

在Array类中则直接返回了this:

public object SyncRoot { get { return this; } }

5. lock关键字是用Monitor(管程)类实现的

lock(x) { DoSomething(); }

System.Object obj = (System.Object)x; System.Threading.Monitor.Enter(obj); try { DoSomething(); } finally { System.Threading.Monitor.Exit(obj); }

以上两段代码是等效的。(MSDN)

使用lock关键字相对于Monitor类在使用上更简单,也更加保险。

【C#中实现线程同步lock关键字的用法详解】相关文章:

浅谈Silverlight 跨线程的使用详解

解析C#中@符号的几种使用方法详解

C#中实现网段扫描的代码

C# dynamic关键字的使用方法

C#线程池用法详细介绍

深入多线程之:Wait与Pulse的使用详解

解读在C#中winform程序响应键盘事件的详解

浅谈C#中Process类的使用详解

c#之利用API函数实现动画窗体的方法详解

c#实现隐藏与显示任务栏的方法详解

精品推荐
分类导航