我经常在SyncLock上看到人们使用的例子
Private Lock1 As New Object ' declaration
SyncLock Lock1 ' usage但是为什么呢?在我的具体情况下,我锁定了一个队列,以避免在多线程、进入队列和数据脱队列方面出现问题。
我可以像这样锁定队列对象本身吗?
Private cmdQueue As New Queue(Of QueueItem) ' declaration
SyncLock cmdQueue ' usage任何帮助都很感激。谢谢。
编辑:
谢谢你所有的答案,但我一直在寻找的就是tcarvin的答案。队列是来自我的singleton对象的私有队列,该对象对将要发送的新消息进行队列处理(由Send方法公开),队列在此对象内的工作线程中使用,每次只有一条消息,而锁中唯一的代码是对Enqueue和Dequeue的调用。
发布于 2012-06-08 15:48:38
来自其他海报的明智建议是肯定的。但答案是肯定的,您可以使用Queue对象锁定。你可以使用任何物体。在您的代码片段中,您将队列实例声明为私有的,因此您可能会避免其他人锁定您的队列对象的常见问题(假设您没有将对象传递到类之外)。不过,最佳实践建议使用专用对象,这样就不会有人更改您的代码,然后公开用于锁定的队列对象。
发布于 2012-06-08 12:13:20
这是关于锁的一个常见的误解。锁的工作是阻止代码,而不是赋予对象线程安全.对象的存在只是为了跟踪锁的状态。而且,由于您希望阻止特定的代码,所以需要一个特定的对象来存储锁状态。公共队列几乎不够具体,它必然会被其他代码使用。如果它也错误地使用队列对象来阻止自己的代码,那么出现严重的死锁问题的几率就很高。
锁定对象以实现线程安全的概念实际上是存在的,这是我的机器似乎从未得到过的密集研究的主题。它被称为STM,“软件事务内存”。维基百科文章就在这里。
发布于 2012-06-08 10:41:38
问题是,其他人可以锁定您的对象,而它将超出您的控制范围。请参阅微软在此锁语句上的最佳实践
https://stackoverflow.com/questions/10947269
复制相似问题