多线程的Monitor线程同步

lock在IL代码中会被翻译成Monitor。而monitor的功能更强大。

也就是Monitor.Enter(obj)和Monitor.Exit(obj).

lock(obj)
{
}
等价为:
 try
{    
     
 Monitor.Enter(obj) 
 }
 catch()
{}
 finally
{
     
	onitor.Exit(obj)  
}

使用LOCK应注意的事项:

通常,应避免锁定 public 类型,否则实例将超出代码的控制范围。常见的结构 lock (this)、lock (typeof (MyType)) 和 lock ("myLock") 违反此准则:
  1.如果实例可以被公共访问,将出现 lock (this) 问题。
  2.如果 MyType 可以被公共访问,将出现 lock (typeof (MyType)) 问题。
   3.由于进程中使用同一字符串的任何其他代码将共享同一个锁,所以出现 lock("myLock") 问题。 
  4.最佳做法是定义 private 对象来锁定, 或 private static 对象变量来保护所有实例所共有的数据。

使用monitor的Wait()和Pulse()方法

wait()

当线程调用 Wait 时,它释放对象的锁并进入对象的等待队列,对象的就绪队列中的下一个线程(如果有)获取锁并拥有对对象的独占使用。Wait()就是交出锁的使用权,使线程处于阻塞状态,直到再次获得锁的使用权。

pulse()

当前线程调用此方法以便向队列中的下一个线程发出锁的信号。接收到脉冲后,等待线程就被移动到就绪队列中。在调用 Pulse 的线程释放锁后,就绪队列中的下一个线程(不一定是接收到脉冲的线程)将获得该锁。pulse()并不会使当前线程释放锁。

猜你喜欢

转载自blog.csdn.net/weixin_41556165/article/details/81666289