在锁内返回会有什么不同吗?

7 .net locking

样本一

Public _objLock As Object = New Object
Public ReadOnly Property MyObjects() As IEnumerable(Of Object)
    Get
        SyncLock _objLock
            If _myObjects Is Nothing Then
                _myObject = LoadMyObjects()
            End If
            Return _myObjects
        End SyncLock
    End Get
End Property
Run Code Online (Sandbox Code Playgroud)

样本二

Public _objLock As Object = New Object
Public ReadOnly Property MyObjects() As IEnumerable(Of Object)
    Get
        SyncLock _objLock
            If _myObjects Is Nothing Then
                _myObject = LoadMyObjects()
            End If              
        End SyncLock
        Return _myObjects
    End Get
End Property
Run Code Online (Sandbox Code Playgroud)

这些实现之间会有什么区别吗?

kem*_*002 5

不,在锁内返回没有任何区别.一旦你离开锁,它将不复存在.

  • 共享相同的锁定对象减少独立的锁的数量,所以可以降低进入死锁情况下的风险 - 线程A需要锁定1,然后试图把锁2.线程B需要锁定2,然后设法采取锁定1如果时机正确,这两个线程将永远等待释放另一个锁.使用多个锁时,必须注意多个锁的所有使用始终以相同的顺序获取锁.随着锁的数量增加,这变得更加困难. (2认同)
  • 一般的经验法则是,每个对象实例只需要一个锁,以保护对象实例不会被多个线程同时调用.在不同实例之间共享相同的锁对象也可以工作,但可能有点过分,因为大多数时候您要保护的是对单个对象实例的私有数据的多线程访问. (2认同)