首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >VB.net SyncLock对象

VB.net SyncLock对象
EN

Stack Overflow用户
提问于 2012-06-08 10:37:24
回答 4查看 6.6K关注 0票数 2

我经常在SyncLock上看到人们使用的例子

代码语言:javascript
复制
    Private Lock1 As New Object ' declaration
    SyncLock Lock1 ' usage

但是为什么呢?在我的具体情况下,我锁定了一个队列,以避免在多线程、进入队列和数据脱队列方面出现问题。

我可以像这样锁定队列对象本身吗?

代码语言:javascript
复制
    Private cmdQueue As New Queue(Of QueueItem) ' declaration
    SyncLock cmdQueue ' usage

任何帮助都很感激。谢谢。

编辑:

谢谢你所有的答案,但我一直在寻找的就是tcarvin的答案。队列是来自我的singleton对象的私有队列,该对象对将要发送的新消息进行队列处理(由Send方法公开),队列在此对象内的工作线程中使用,每次只有一条消息,而锁中唯一的代码是对Enqueue和Dequeue的调用。

EN

回答 4

Stack Overflow用户

回答已采纳

发布于 2012-06-08 15:48:38

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

票数 3
EN

Stack Overflow用户

发布于 2012-06-08 12:13:20

这是关于锁的一个常见的误解。锁的工作是阻止代码,而不是赋予对象线程安全.对象的存在只是为了跟踪锁的状态。而且,由于您希望阻止特定的代码,所以需要一个特定的对象来存储锁状态。公共队列几乎不够具体,它必然会被其他代码使用。如果它也错误地使用队列对象来阻止自己的代码,那么出现严重的死锁问题的几率就很高。

锁定对象以实现线程安全的概念实际上是存在的,这是我的机器似乎从未得到过的密集研究的主题。它被称为STM,“软件事务内存”。维基百科文章就在这里

票数 2
EN

Stack Overflow用户

发布于 2012-06-08 10:41:38

问题是,其他人可以锁定您的对象,而它将超出您的控制范围。请参阅微软在此锁语句上的最佳实践

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/10947269

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档