在多线程中,为了防止多个线程对一个变量赋值的更改或者一段代码段的逻辑的修改,需要对这个赋值动作或者代码段加锁。
private AutoResetEvent _autoSetEvent = new AutoResetEvent(false);
在启动一个线程后但是需等待时:
if (!isStart)
{
Logger.Info("侦听线程进入等待!");
_autoSetEvent.WaitOne();
Logger.Info("侦听线程再次运行!");
}
需要启动时:
_autoSetEvent.Set();
private object _startLock = new object();
lock (_startLock)
{
isStart = _boolStarted;
}
关于lock对一个对象加锁要注意,可以在递归中使用,lock只会生效于多线程,对于单线程,自身已经是锁的所有者,并不会出现为了继续加锁等待原有锁释放,递归中不会发生锁死。