LockManager 类
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 支持的"命名锁"概念 e.g.时,我们必须锁定其我们可能没有稳定的对象在内存中的某些实体,但还只是此类实体的名称。示例包括邮箱和数据库。与邮箱或数据库相关联的任何对象可以进出,我们有稳定的此类实体的名称,如数据库或邮箱的邮箱号码数据库 GUID。我们支持命名的锁的监视器锁和读取器-编写器锁。
LockManager 还支持普通"反对锁",当我们必须在内存中锁定特定对象实例。仅显示器目前支持的对象锁锁相同的锁定机制,在 C#"锁定"语句中使用。不同于"锁定"语句,LockManager 对象锁定完全参与锁定层次结构,因此我们可以验证正确的顺序使用它们。
"对象锁定"的一种特殊情况是"叶对象锁"。我们不必指定此类锁的锁定级别-预计始终是最嵌套锁和叶锁类时可以采取其他任何锁。
实现动态分配锁定对象的每个唯一的名称,并将其存储在全局字典中的"命名锁定"。因此按名称访问命名的锁定要求词典查找来查找相应的锁定对象。锁定对象字典应本身被锁定在执行此类搜索时。所有这些使得命名的锁可能高于普通的锁,由于的锁定字典和词典查找其他成本。我们使用两种技术,以减少此类成本: (1) 分区锁定对象字典,以减少词典全局锁争用,和 (2) 提供调用方能够缓存命名的锁定对象引用并跳过该词典查找大部分时间。请注意单独分区不足因为不能帮助要比相对范围锁如数据库锁。 例如,当每个人都需要相同获取共享锁。
没有可能未绑定的名称唯一的锁数。因此,我们可能会导致命名的锁定对象的数量也是未绑定的。由于命名的锁定对象的引用存储在全局字典中,此类对象可能永远不会自动垃圾回收。因此,我们希望能够清除不经常使用的命名的锁定对象。若要支持命名的锁定对象的线程安全的清理,此类对象是 refcounted。每个命名的锁定对象占用的锁需要拥有"addrefed"的此类对象,释放锁定之后,应释放的引用。清理逻辑检查的对象当前没有引用之前从词典中删除它。从词典中删除命名的锁定对象后,它被标记为释放并不能为 addrefed 个。要锁定相同的名称下一次尝试都将导致分配新的命名的锁定对象具有相同的名称,并将其添加到词典。因此是确定将陈旧命名锁定对象引用由调用方缓存-将检测到此类过时的引用,并将其更新我们试图将其锁定,并分配一个新的锁定对象在下一次。
我们使用基于简单时间启发式算法来清理未使用的锁定对象。每 N 上名为我们检查是否存在的时间运行清理,然后检查词典并收集所有未引用的对象的最近未使用的锁释放调用。然后,我们尝试处理此类的每个对象,并从字典中删除它的引用。清理是每个词典分区,,因此我们不必非要运行的任何给定分区清除锁定其他分区。
线程安全
此类型的任何公共 static(在 Visual Basic 中为 Shared) 成员都是线程安全的。但不保证所有实例成员都是线程安全的。