VB.NET 如果我想锁定多个东西,我是否需要多个 SyncLocks?

标签 vb.net multithreading list locking

VB.NET 2010、.NET 4

大家好,

我的问题是,假设我在修改这两个对象的多线程环境中有两个 List(Of T) 对象和一个子例程。我不太了解锁,所以我不确定我是否可以这样做:

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

?有什么见解吗?我什至走在正确的轨道上吗?任何意见将不胜感激。

非常感谢,布赖恩

最佳答案

首先,锁定非私有(private)对象是不好的做法,因为其他东西可能会锁定它,然后事情从那里走下坡路,而不是锁定私有(private)成员对象,例如

Class Class1
    Private lockObject as New Object

    Public Sub Clear()
        SyncLock lockObject
           ...
        End Synclock
    End Sub
End Class

现在,对于实际问题:除非您所做的每个操作都修改了两个列表(值得怀疑),否则每个列表都应该有一个锁。虽然可以使用一个锁对象来表示“我正在用一个列表做某事”,但在另一个线程中阻止一个与你的列表不同的线程中的方法没有多大意义,而且只会减慢放下一切。

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

另外,作为一般说明:保持锁定的时间越短越好。你花在锁上的时间越少,另一个线程出现并被阻塞直到你完成的机会就越小。

MSDN Page on SyncLock可能也值得一读,它包含此信息和一些示例。 @BasicLife 是正确的,请始终确保以相同的顺序在任何地方使用锁。

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

关于VB.NET 如果我想锁定多个东西,我是否需要多个 SyncLocks?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4800941/

相关文章:

python - 在 Python 中,有效地确定两个列表是否是彼此的移位副本

vb.net - 使用 Linq VB.NET 选择组中的最大日期项目

java - Java 中的字符串和并发

java - 在 Java 中使用并行求解时出现越界异常

c# - 使用 Xamarin 显示 Android ProgressBar

r - 使用 lapply 更改列表列表

java - 为什么 int[] 上的 Arrays.asList 返回 List<int[]> 而不是 List<int>?

vb.net - Visual Basic 中的数组

c# - C# 和 VB.Net 中同一程序的溢出行为差异

vb.net - 由于继承抽象类而禁用设计器?