时间:2021-05-20
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等类中实现如下:
在Array类中则直接返回了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类在使用上更简单,也更加保险。
声明:本页内容来源网络,仅供用户参考;我单位不保证亦不表示资料全面及准确无误,也不保证亦不表示这些资料为最新信息,如因任何原因,本网内容或者用户因倚赖本网内容造成任何损失或损害,我单位将不会负任何法律责任。如涉及版权问题,请提交至online#300.cn邮箱联系删除。
本文实例讲述了C#中lock的用法。分享给大家供大家参考。具体分析如下:lock关键字可以用来确保代码块完成运行,而不会被其他线程中断。这是通过在代码块运行期间
本文介绍C#lock关键字,C#提供了一个关键字lock,它可以把一段代码定义为互斥段(criticalsection),互斥段在一个时刻内只允许一个线程进入执
lock关键字可以用来确保代码块完成运行,而不会被其他线程中断。这是通过在代码块运行期间为给定对象获取互斥锁来实现的。lock语句以关键字lock开头,它有一个
在Python中没有类似Java中使用的synchronized关键字来同步方法,因此在Python中要实现同步方法,通常我们是使用threading.Lock
在使用Lock之前,我们使用的最多的同步方式应该是synchronized关键字来实现同步方式了。配合Object的wait()、notify()系列方法可以实