如何在VB.NET中锁定原始静态字段

时间:2015-03-25 17:29:40

标签: vb.net

我知道你可以获得像这样的锁实例成员:

SyncLock [Object]
    [Object].mutate()
End SyncLock

但你如何锁定静态字段?

(例如,使[Object's Class].[static field] = [new value]线程安全)

我无法在线找到VB的任何内容。

该字段是基本类型。

1 个答案:

答案 0 :(得分:3)

只要对象是引用类型,您就可以简单地锁定该对象:

SyncLock [Class].[Object]
    ' … edit object
End SyncLock

根据您的情况,这可能是正确的做法。但是,请注意,理想情况下,这应该只在私有对象上完成,类中。否则,您无法保证每个客户端都能正确锁定对象。

此字段是否为基本类型在此处并不重要,除了大多数基本类型是值类型,并且您无法锁定它们。因此,假设您的类型是值类型,您必须使用单独的锁定对象,如注释中所述:

Private Shared ReadOnly LockObj As New Object()

但是,澄清一下,锁定LockObj会使神奇地锁定其他类。它只提供了一个用于锁定的协议,只要每个访问字段的线程都遵守这个协议,你就是安全的。这是一个例子:

Class Foo
    Private Shared ReadOnly LockObj As New Object()
    Private Shared MyValue As Integer = 1

    Public Shared Sub UpdateValue()
        SyncLock LockObj
            MyValue += 1
        End SyncLock
    End Sub

    Public Shared Function ReadValue() As Integer
        SyncLock LockObj
            Return MyValue
        End SyncLock
    End Function
End Class

只要每个帖子仅使用UpdateValueReadValue来访问MyValue,就可以避免竞争条件。