首先lock和Minitor有什么区别呢?

  其实lock在IL代码中会被翻译成Monitor。也就是Monitor.Enter(obj)和Monitor.Exit(obj).

lock (obj)
{
}

  等价为:

try
{
  Monitor.Enter(obj);
}
finally
{
  Monitor.Exit(obj);
}

  所以lock能做的,Monitor肯定能做,Monitor能做的,lock不一定能做。

  那么Monitor额外的功能呢?

  1:Monitor.TryEnter(obj,timespan)----timeout之后,就不执行这段代码了。lock可是一直会死等的。

  2:还有Monitor.Wait()和Monitor.Pulse()。在lock代码里面如果调用了Monitor.Wait(),会放弃对资源的所有权,让别的线程lock进来。然后别的线程代码里Pulse一下(让原线程进入到等待队列),然后在Wait一下释放资源,这样原线程的就可以继续执行了(代码还堵塞在wait那句话呢)。也就是说,必须两个或多个线程共同调用Wait和Pulse,把资源的所有权抛来抛去,才不会死锁。和AutoEvent相似是处理同步关系的,但是AutoEvent是跨进程的,而Monitor是针对线程的