我总是在使用
的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的电话。
答案 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
并锁定它