Thread锁 Monitor类、Lock关键字和Mutex类

Monitor 类锁定一个对象html

当多线程公用一个对象时,也会出现和公用代码相似的问题,这种问题就不该该使用lock关键字了,这里须要用到System.Threading中的一个类Monitor,咱们能够称之为监视器,Monitor提供了使线程共享资源的方案。 web

  Monitor类能够锁定一个对象,一个线程只有获得这把锁才能够对该对象进行操做。对象锁机制保证了在可能引发混乱的状况下一个时刻只有一个线程能够访问这个对象。 Monitor必须和一个具体的对象相关联,可是因为它是一个静态的类,因此不能使用它来定义对象,并且它的全部方法都是静态的,不能使用对象来引用。下面代码说明了使用Monitor锁定一个对象的情形:多线程

...... Queue oQueue=new Queue(); ...... Monitor.Enter(oQueue); ......//如今oQueue对象只能被当前线程操纵了 Monitor.Exit(oQueue);//释放锁 spa

如上所示,当一个线程调用Monitor.Enter()方法锁定一个对象时,这个对象就归它全部了,其它线程想要访问这个对象,只有等待它使用Monitor.Exit()方法释放锁。为了保证线程最终都能释放锁,你能够把Monitor.Exit()方法写在try-catch-finally结构中的finally代码块里。线程

对于任何一个被Monitor锁定的对象,内存中都保存着与它相关的一些信息: 其一是如今持有锁的线程的引用; 其二是一个预备队列,队列中保存了已经准备好获取锁的线程; 其三是一个等待队列,队列中保存着当前正在等待这个对象状态改变的队列的引用。orm

当拥有对象锁的线程准备释放锁时,它使用Monitor.Pulse()方法通知等待队列中的第一个线程,因而该线程被转移到预备队列中,当对象锁被释放时,在预备队列中的线程能够当即得到对象锁。 htm

已上内容转自:http://www.cnblogs.com/xugang/archive/2008/03/23/1118594.html对象

 

Lock就不用多说了,只留作记录blog

Lock 只能对引用对象加锁队列

Monitor 能够对值类型加锁,其实是在调用Monitor.Enter时对值类型装箱了

相关文章
相关标签/搜索