我有一种情况,多个线程可以访问一个类,该类由3个私有值和6个属性组成,这些属性获取/设置3个值的各种算术组合。然后我还有6个属性只是类型转换,因为它们调用前6个属性作为其获取/设置操作的一部分。
前6个属性的所有get / set函数都会同步到同一个对象。我想将其他6的get / set函数同步到同一个对象,因为它们使用了一些相同的实用程序对象,但是我想到这会导致同一个对象连续两次同步..像这样:
Private lock As New Object
Private _dCool As Double
Public Property dCool As Double
Get
SyncLock lock
Return _dCool
End SyncLock
End Get
Set(value As Double)
SyncLock lock
_dCool = value
End SyncLock
End Set
End Property
Public Property iCool As Integer
Get
SyncLock lock
Return dCool
End SyncLock
End Get
Set(value As Integer)
SyncLock lock
dCool = value
End SyncLock
End Set
End Property
在这个例子中没有必要同步iCool,但它只是为了说明问题。就我的测试而言,这似乎没有任何问题,但只是想问一下我现在看不到的一些问题是否可以通过这样做来实现?
答案 0 :(得分:1)
是的,不是问题。当您使用SyncLock关键字时,VB.NET编译器会生成对Monitor.Enter / Exit()的调用,以及Try / Finally块,以确保始终退出输入的监视器。 Monitor.Enter的MSDN文章说:
同一个线程在没有阻止的情况下多次调用Enter 是合法的;但是,在等待对象的其他线程将解除阻塞之前,必须调用相同数量的Exit调用。
相关词组加粗。 Finally块确保始终满足Exit()调用要求。