.net 某种同步锁

.net 某种同步锁,.net,vb.net,multithreading,.net,Vb.net,Multithreading,我正在签出这段代码,它正在做一些类似于同步锁的事情,但是其他线程没有等待,而是跳过了代码 代码是用变量实现的;我想知道是否有一个内置的.net函数可以做到这一点 Private _previousValueCount As Integer = 0 Private Sub F() If _previousValueCount = 0 Then _previousValueCount = 1 ' ... _previousValueCount = 0

我正在签出这段代码,它正在做一些类似于同步锁的事情,但是其他线程没有等待,而是跳过了代码

代码是用变量实现的;我想知道是否有一个内置的.net函数可以做到这一点

Private _previousValueCount As Integer = 0

Private Sub F()
   If _previousValueCount = 0 Then
       _previousValueCount = 1
       ' ...
       _previousValueCount = 0
   End If
End Sub

有很多方法可以做到这一点;一种方法是执行以下操作:

int lockTaken = 0;

...

bool haveLock = false;
try {
    haveLock = Interlocked.CompareExchange(ref lockTaken, 1, 0) == 0;
    if(haveLock) {
       // it was zero, it is now one; you won the lock: do something
    }
} finally {
    if(haveLock) Interlocked.Exchange(ref lockTaken, 0);
}
另一种方法是使用具有零超时的
Monitor.TryEnter

readonly object syncLock = new object();
...
bool haveLock = false;
try {
    Monitor.TryEnter(syncLock, 0, ref haveLock);
    if(haveLock) {
      // you won it; do something
    }
} finally {
    if(haveLock) Monitor.Exit(syncLock);
}

您可以使用类,该类尝试获取对任何类型的全局对象的锁定。如果在特定的时间间隔/毫秒内未获得锁,则可以根据需要执行操作

bool acquiredLock = false;
try
{
  Monitor.TryEnter(lockObject, 1000, ref acquiredLock);
  if (acquiredLock)
  {
    // got lock, do something
  }
  else
  {
    // no lock - warning/error/...
  }
}
finally
{
  if (acquiredLock)
     Monitor.Exit(lockObject);  // release lock!
}
顺便说一句,该代码不是线程安全的;这与我发布的
Interlocked
版本基本相同,但区别在于
Interlocked
是线程安全的