即使该类型对象在您的应用程序域中是唯一的,这仍然是一种不好的做法,因为任何代码都可以访问公共类型的类型对象,从而导致死锁的发生。如果您在应用程序中使用的组件不是您编写的,这种做法尤其成问题。(即使是 lock(this)/SyncLock Me 也可能有这个问题,因为其他人可能会锁定您。即使发生了这种事情,问题的根源也可能会比锁定类型对象而导致的死锁更容易发现,因为您的对象并不是跨应用程序域的全局可用对象。)
' VB .NET SyncLock GetType(MyClass) ' BAD CODE! NO! NO! NO! ' statements End SyncLock 更改为以下正确代码:
// C# lock(somePrivateStaticObject) { // Good code! // statements; }
' VB .NET SyncLock GetType(somePrivateStaticObject) ' Good code! ' statements End SyncLock 当然,您必须已经拥有一个要锁定的私有静态对象(如果您使用锁定来修改静态对象,实际上您可能已经有了一个!)或者必须创建一个。(使它成为私有对象可以避免其他类锁定您的对象。)请不要尝试锁定不是引用(对象)类型的字段,例如 int/Integer。那样会出现编译器错误。如果您没有要锁定的私有静态对象,可能需要创建一个哑对象:
// C# Class MyClass { private static Object somePrivateStaticObject = new Object(); // methods of class go here--can lock somePrivateStaticObject }
' VB .NET Class MyClass Private Shared somePrivateStaticObject As New Object ' methods of class go here--can lock somePrivateStaticObject End Class 您需要单独分析每种情况,以确保不会出现问题,但通常上述技巧会奏效。