VB.NET如果要锁定多个对象,是否需要多个同步锁?

VB.NET如果要锁定多个对象,是否需要多个同步锁?,vb.net,multithreading,list,locking,Vb.net,Multithreading,List,Locking,VB.NET2010,.NET4 大家好, 我的问题是,假设我在一个多线程环境中有两个ListT对象和一个子例程,可以修改这两个对象。我不太懂锁,所以我不确定我是否能做到: SyncLock CType(List1, IList).SyncRoot List1.Clear() List2.Clear() End SyncLock 或者我必须: SyncLock CType(List1, IList).SyncRoot SyncLock CType(List2, IList).S

VB.NET2010,.NET4

大家好,

我的问题是,假设我在一个多线程环境中有两个ListT对象和一个子例程,可以修改这两个对象。我不太懂锁,所以我不确定我是否能做到:

SyncLock CType(List1, IList).SyncRoot

  List1.Clear()
  List2.Clear()

End SyncLock
或者我必须:

SyncLock CType(List1, IList).SyncRoot
  SyncLock CType(List2, IList).SyncRoot

    List1.Clear()
    List2.Clear()

  End SyncLock
End SyncLock
??有什么见解吗?我走对了吗?如有任何意见,将不胜感激


事先多谢了,Brian首先,锁定一个非私有对象是一种不好的做法,因为其他东西可能会锁定它,然后事情就从这里开始走下坡路,而不是锁定一个私有成员对象,比如

Class Class1
    Private lockObject as New Object

    Public Sub Clear()
        SyncLock lockObject
           ...
        End Synclock
    End Sub
End Class
现在,对于实际问题:除非您执行的每个操作都修改两个列表,否则每个列表应该有一个锁。虽然可以使用一个lock对象来表示我正在使用一个列表执行某些操作,但在另一个线程中阻止一个与您的列表不在同一个列表上运行的方法并没有多大意义,这只会降低所有操作的速度

因此,简言之:每一组锁使用一个lock对象用于在列表1上操作锁,在列表2上操作锁,等等。对于在两个列表上操作的部分,代码稍微多一些,但是代码的性能会更好

另外,作为一般注意事项:尽可能短的时间保持锁。在锁中花费的时间越少,另一个线程出现并被阻塞的机会就越小,直到完成为止

这本书可能也值得一读,它包含了这些信息和一些例子。而且@BasicLife是正确的,始终确保在任何地方都按相同的顺序取锁


以及贯穿整个框架的一般规则,除非您访问类上的静态成员,除非另有说明,否则它不是线程安全的。因此,在对列表进行操作时,当您在列表上添加、删除、清除或枚举时,您会希望锁定,我相信还有其他的,但这些是最常见的。

首先,锁定非私有对象是一种不好的做法,因为其他对象可能会锁定它,然后事情会从那里开始,而不是锁定私有成员对象,差不多

Class Class1
    Private lockObject as New Object

    Public Sub Clear()
        SyncLock lockObject
           ...
        End Synclock
    End Sub
End Class
现在,对于实际问题:除非您执行的每个操作都修改两个列表,否则每个列表应该有一个锁。虽然可以使用一个lock对象来表示我正在使用一个列表执行某些操作,但在另一个线程中阻止一个与您的列表不在同一个列表上运行的方法并没有多大意义,这只会降低所有操作的速度

因此,简言之:每一组锁使用一个lock对象用于在列表1上操作锁,在列表2上操作锁,等等。对于在两个列表上操作的部分,代码稍微多一些,但是代码的性能会更好

另外,作为一般注意事项:尽可能短的时间保持锁。在锁中花费的时间越少,另一个线程出现并被阻塞的机会就越小,直到完成为止

这本书可能也值得一读,它包含了这些信息和一些例子。而且@BasicLife是正确的,始终确保在任何地方都按相同的顺序取锁


以及贯穿整个框架的一般规则,除非您访问类上的静态成员,除非另有说明,否则它不是线程安全的。因此,在对列表进行操作时,当您在列表上添加、删除、清除或枚举时,您会希望锁定,我相信还有其他的,但这些是最常见的。

仅扩展Matt的答案,如果您需要多个锁定,请确保以相同的顺序锁定对象

如果在方法1中,您执行以下操作:

在方法2中,您可以:

然后会出现死锁情况,如果两个方法同时被不同的线程调用,则会出现以下情况:

thread 1 on Method1 locks list 1
thread 2 on Method2 locks list 2
thread 1 on Method1 waits until list 2 is released
thread 2 on Method2 waits until list 1 is released
Threads 1 and 2 are now deadlocked and eventually one or both will be killed off

为了扩展Matt的答案,如果需要多个锁,请确保以相同的顺序锁定对象

如果在方法1中,您执行以下操作:

在方法2中,您可以:

然后会出现死锁情况,如果两个方法同时被不同的线程调用,则会出现以下情况:

thread 1 on Method1 locks list 1
thread 2 on Method2 locks list 2
thread 1 on Method1 waits until list 2 is released
thread 2 on Method2 waits until list 1 is released
Threads 1 and 2 are now deadlocked and eventually one or both will be killed off

谢谢你的回复。不过,我还有一个后续问题。我发了一封信。谢谢你的回复。不过,我还有一个后续问题。我把它做成了一个蛋糕。