LockManager 选件类。
继承层次结构
System.Object
Microsoft.TeamFoundation.Framework.Server.LockManager
命名空间: Microsoft.TeamFoundation.Framework.Server
程序集: Microsoft.TeamFoundation.Framework.Server(在 Microsoft.TeamFoundation.Framework.Server.dll 中)
语法
声明
Public Class LockManager
public class LockManager
LockManager 类型公开以下成员。
构造函数
名称 | 说明 | |
---|---|---|
![]() |
LockManager | 构造函数 |
页首
方法
页首
备注
托管应用仓库实践死锁排除。 所有锁必须使用 LockManager 锁。 每个锁被分配级别 (在锁定的层次结构中的位置),因此,所有操作只能请求比当前持有的任何锁高于该层次结构的锁。
LockManager 支持名为“锁定”概念,也就是说,我们必须锁定我们不可能会在内存中的稳定的对象的某个实体,但是,有这样的实体的名称。 示例是邮箱和数据库。 所有对象与邮箱或数据库可能是附带往往,有这样的实体的稳定是其名称的所有,例如一个数据库或邮箱数字的数据库 GUID 邮箱的。 我们支持监视器锁和读写器锁名为的锁定。
我们必须锁定内存时,的特定对象实例 LockManager 还支持泛型的“对象锁”。 只能监视器锁为对象锁,其中是当前支持是相同闭锁器 (在 C#“锁定”语句。 与“锁定”语句不同,LockManager 对象锁定完全参与一个锁定的层次结构,因此我们可以验证它们用于了正确的排序。
一个特例“对象锁”是“叶对象锁”。 我们不必为这些锁指定锁定级别-应始终是一最嵌套的锁,而其他锁不可接受,当保存此类叶锁时。
“名为锁”通过动态分配每个唯一名称的锁定对象并存储到实现在一个全局字典。 因此访问命名锁定名称需要字典中查找相应的锁定对象。 锁定对象字典如果自身将被锁定,当您执行此类外观。 所有这些元素的锁定使名为锁可能昂贵,由于锁定字典和字典查找的增加成本。 我们使用两种技术减少此类成本:(1) 分区锁定对象字典,减少字典全局锁争用和 (2) 大多数时候向调用方能够缓存名为锁定对象引用并跳过字典查找。 请注意单独的分区,不够用,因为它不相对有助于宽范围锁,例如数据库锁;例如,在中,当每个人若要访问同一共享锁。
具有唯一的锁名称的极大数量的。 因此,可以可能会创建名为锁定对象的数量也是无限制的。 由于对名为锁定对象的引用在一个全局字典存储,这些对象不能自动垃圾回收。 因此我们希望能够清理不经常使用的命名锁定对象。 若要支持命名锁定对象线程安全的清理,此类对象 refcounted。 在释放后,在一个名为锁定对象执行的每个锁需要这样的对象“addrefed”,引用应释放锁。 清理逻辑 tab 对象不会在移除它之前当前引用从字典。 在命名锁定对象从字典之后被取消,它被标记为已配置并不能 addrefed。 您应下时对锁的一个尝试将导致分配具有相同名称并将其添加到字典的新命名锁定对象。 因此可能有过时名为锁定对象引用缓存由调用方-将检测这些过时引用和更新,则下次我们尝试锁定并分配一个新锁定对象。
我们使用简单的时间基于试探法清理未使用的锁定对象。 在每个 N 名为锁释放上告诉我们 tab 键是否存在时运行清理,然后检查字典并收集最近未使用的所有未引用的对象。 然后我们尝试配置每一个这样的对象和从字典取消其引用。 清理是每个字典分区,因此,我们无需锁定其他分区,我们运行任何特定分区时清除。
线程安全
此类型的任何公共 static(在 Visual Basic 中为 Shared) 成员都是线程安全的。但不保证所有实例成员都是线程安全的。