VB.net SyncLock对象

时间:2012-06-08 10:37:24

标签: vb.net multithreading object thread-safety synclock

我总是在使用

的SyncLock示例中看到过
    Private Lock1 As New Object ' declaration
    SyncLock Lock1 ' usage

但为什么呢? 在我的具体情况下,我正在锁定一个队列,以避免多线程入队和出列数据的问题。

我可以像这样锁定Queue对象吗?

    Private cmdQueue As New Queue(Of QueueItem) ' declaration
    SyncLock cmdQueue ' usage

任何帮助表示赞赏。 感谢。

修改

感谢所有答案,但是tcarvin的回答是我正在寻找的。 该队列是我的singleton Comms对象的私有队列,它将要发送的新消息排队(由Send方法公开),该队列中的队列一次消耗一条消息,并且锁中的唯一代码是一个叫Enqueue和Dequeue的电话。

4 个答案:

答案 0 :(得分:3)

来自其他海报的圣人建议肯定。但答案是肯定的,您可以使用Queue对象锁定。您可以使用任何对象。在您的代码片段中,您将队列实例声明为私有,因此您可能会避免其他人锁定您的队列对象的常见问题(假设您没有将对象传递到您的类之外)。最好的做法虽然建议使用一个专用的对象,这样,在未来的道路上,有人不会更改您的代码,然后公开用于锁定的队列对象。

答案 1 :(得分:2)

这是关于锁的常见误解。锁的作用是阻止代码,而不是在对象上赋予线程安全性。该对象仅用于跟踪锁的状态。并且由于您要阻止特定的位代码,因此您需要一个特定的对象来存储锁定状态。公共队列不够具体,它必然会被其他地方的其他代码使用。如果它也错误地使用队列对象来阻止它自己的代码,那么一个讨厌的死锁问题的可能性很高。

锁定对象以实现线程安全的概念实际上存在,它是激烈研究的主题,似乎永远不会到达我的机器。它被称为STM,“软件事务存储器”。维基百科文章is here

答案 2 :(得分:1)

问题是其他人可以锁定您的对象,这将超出您的控制范围。 请参阅Microsoft lock statement

上的最佳做法

答案 3 :(得分:-1)

我认为你所做的是不好的做法,因为锁定的对象必须保持不变。由于您锁定Queue(Of QueueItem)然后从同一个队列中出队,然后对象发生变化,如下所述:https://msdn.microsoft.com/en-us/library/3a86s51t.aspx(第二条规则),

  

该机制要求锁定对象保持不变。

所以你应该这样做Public StatusObject As New Object并锁定它