2

有没有简单的方法来同步锁定一个可以为空的对象?

在您提出要求之前,是的,我知道对空变量执行 SyncLock 是不合逻辑的。但是,这将简化我的代码,因为现在,我别无选择,只能在调用 SyncLock 之前对所有地方执行空检查。

If myObjectA Is Nothing Then
  myObjectA = myObjectB
Else
  SyncLock myObjectA
    myObjectA = myObjectB
  End SyncLock
End If
4

3 回答 3

4

是的,使用 Helper 对象。

无论如何,当它用作锁时,您不应该分配给 myObjectA。

来自MSDN

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

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

于 2011-03-25T18:00:28.353 回答
3

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

请记住,锁定是针对引用而不是值!基本上,它所做的是阻止所有不在锁内的代码块对指定引用的访问。

于 2011-03-25T18:04:07.060 回答
3

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

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

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
于 2011-03-25T18:15:28.490 回答