【问题标题】:Does return inside a lock makes any difference?在锁内返回有什么不同吗?
【发布时间】:2011-03-17 04:10:58
【问题描述】:

示例一

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

示例二

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

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

【问题讨论】:

    标签: .net locking


    【解决方案1】:

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

    【讨论】:

    • 共享锁对象而不是成员变量有什么好处吗?
    • 锁只适用于可以访问同一个锁的东西。如果对象 A 和 B 有自己的成员变量 lock,A 将锁定它的锁,B 将锁定它的锁。
    • 共享同一个锁对象减少了独立锁的数量,因此可以降低陷入死锁情况的风险——线程A获取锁1,然后尝试获取锁2。线程B获取锁2,然后尝试获取锁1。如果时机合适,这两个线程将永远等待另一个锁被释放。使用多个锁时,您必须小心所有使用多个锁的操作始终以相同的顺序获取锁。随着锁数量的增加,这变得更加困难。
    • 一般的经验法则是每个对象实例只需要一个锁来保护对象实例不被多个线程同时调用。在不同实例之间共享同一个锁对象也可以工作,但可能有点过头了,因为大多数时候您要保护的是对单个对象实例的私有数据的多线程访问。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-02-10
    • 1970-01-01
    • 2013-03-11
    • 2012-07-01
    • 1970-01-01
    • 2011-03-30
    相关资源
    最近更新 更多