首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >null对象上的SyncLock

null对象上的SyncLock
EN

Stack Overflow用户
提问于 2011-03-26 01:58:49
回答 3查看 1.5K关注 0票数 2

有没有简单的方法来SyncLock一个可以为空的对象?

在你要求它之前,是的,我知道在一个空变量上执行SyncLock是不符合逻辑的。但是,这将简化我的代码,因为现在,我别无选择,只能在调用SyncLock之前执行空值检查。

代码语言:javascript
复制
If myObjectA Is Nothing Then
  myObjectA = myObjectB
Else
  SyncLock myObjectA
    myObjectA = myObjectB
  End SyncLock
End If
EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2011-03-26 02:15:28

不,您不能使用空引用作为锁的标识符。

如果引用可以为空,那么您甚至不能使用它作为标识符,因此您当前的代码不是线程安全的。您必须使用不同的方式来标识锁。两个不同的线程可以替换空引用,而不能互相排除,这将导致一个引用被另一个引用覆盖:

代码语言:javascript
复制
If myObjectA Is Nothing Then
  ' Here another thread can change the reference, believing that it's safe
  myObjectA = myObjectB
Else
  SyncLock myObjectA
    myObjectA = myObjectB
  End SyncLock
End If
票数 3
EN

Stack Overflow用户

发布于 2011-03-26 02:00:28

是,使用Helper对象。

当myObjectA被用作一个锁的时候,你无论如何都不应该给它赋值。

来自MSDN

锁定对象值。lockobject的值不能为Nothing。在SyncLock语句中使用锁对象之前,必须先创建锁对象。

在执行SyncLock块时不能更改lockobject的值。该机制要求锁对象保持不变。

票数 4
EN

Stack Overflow用户

发布于 2011-03-26 02:04:07

可能有一些重构可以帮助避免这些情况。这段代码看起来很奇怪。将一个对象赋给lock变量,如果为空,则为锁,如果不为空,则为锁似乎是错误的。另外,您可以锁定然后更改lock变量!

请记住,锁定指向的是引用而不是值!基本上,它所做的就是从锁之外的所有代码块中对指定的引用进行块访问。

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

https://stackoverflow.com/questions/5436291

复制
相关文章

相似问题

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