在同一个线程中是双重同步吗?

时间:2014-07-29 21:13:00

标签: vb.net

我有一种情况,多个线程可以访问一个类,该类由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,但它只是为了说明问题。就我的测试而言,这似乎没有任何问题,但只是想问一下我现在看不到的一些问题是否可以通过这样做来实现?

1 个答案:

答案 0 :(得分:1)

是的,不是问题。当您使用SyncLock关键字时,VB.NET编译器会生成对Monitor.Enter / Exit()的调用,以及Try / Finally块,以确保始终退出输入的监视器。 Monitor.Enter的MSDN文章说:

  

同一个线程在没有阻止的情况下多次调用Enter 是合法的;但是,在等待对象的其他线程将解除阻塞之前,必须调用相同数量的Exit调用。

相关词组加粗。 Finally块确保始终满足Exit()调用要求。