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