有没有简单的方法来SyncLock一个可以为空的对象?
在你要求它之前,是的,我知道在一个空变量上执行SyncLock是不符合逻辑的。但是,这将简化我的代码,因为现在,我别无选择,只能在调用SyncLock之前执行空值检查。
If myObjectA Is Nothing Then
myObjectA = myObjectB
Else
SyncLock myObjectA
myObjectA = myObjectB
End SyncLock
End If发布于 2011-03-26 02:15:28
不,您不能使用空引用作为锁的标识符。
如果引用可以为空,那么您甚至不能使用它作为标识符,因此您当前的代码不是线程安全的。您必须使用不同的方式来标识锁。两个不同的线程可以替换空引用,而不能互相排除,这将导致一个引用被另一个引用覆盖:
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-26 02:00:28
是,使用Helper对象。
当myObjectA被用作一个锁的时候,你无论如何都不应该给它赋值。
来自MSDN
锁定对象值。lockobject的值不能为Nothing。在SyncLock语句中使用锁对象之前,必须先创建锁对象。
在执行SyncLock块时不能更改lockobject的值。该机制要求锁对象保持不变。
发布于 2011-03-26 02:04:07
可能有一些重构可以帮助避免这些情况。这段代码看起来很奇怪。将一个对象赋给lock变量,如果为空,则为锁,如果不为空,则为锁似乎是错误的。另外,您可以锁定然后更改lock变量!
请记住,锁定指向的是引用而不是值!基本上,它所做的就是从锁之外的所有代码块中对指定的引用进行块访问。
https://stackoverflow.com/questions/5436291
复制相似问题