有没有简单的方法来同步锁定一个可以为空的对象?
在您提出要求之前,是的,我知道对空变量执行 SyncLock 是不合逻辑的。但是,这将简化我的代码,因为现在,我别无选择,只能在调用 SyncLock 之前对所有地方执行空检查。
If myObjectA Is Nothing Then
myObjectA = myObjectB
Else
SyncLock myObjectA
myObjectA = myObjectB
End SyncLock
End If
是的,使用 Helper 对象。
无论如何,当它用作锁时,您不应该分配给 myObjectA。
来自MSDN:
锁定对象值。lockobject 的值不能为 Nothing。在 SyncLock 语句中使用它之前,您必须创建锁定对象。
执行 SyncLock 块时不能更改 lockobject 的值。该机制要求锁定对象保持不变。
可能有一些重构可以帮助避免这些情况。这段代码看起来很奇怪。如果为空,则将对象分配给锁定变量,如果不是,则锁定似乎是错误的。加上你锁定然后更改锁定变量!
请记住,锁定是针对引用而不是值!基本上,它所做的是阻止所有不在锁内的代码块对指定引用的访问。
不,您不能使用空引用作为锁的标识符。
如果引用可以为空,您甚至不能使用引用作为标识符,因此您当前的代码不是线程安全的。您必须使用不同的方式来识别锁。两个不同的线程可以替换空引用,但不能相互排除,这会导致一个引用被另一个覆盖:
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