空对象上的SyncLock

时间:2011-03-25 17:58:49

标签: .net vb.net synclock

SyncLock有一个简单的方法可以为null吗?

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

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

3 个答案:

答案 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