解决多线程读写同一个文件的异常

多线程公用一个对象时,也会出现和公用代码类似的问题,这种问题就不应该使用lock关键字了,这里需要用到System.Threading中  
  的一个类Monitor,我们可以称之为监视器,Monitor提供了使线程共享资源的方案。     
    Monitor类可以锁定一个对象,一个线程只有得到这把锁才可以对该对象进行操作。对象锁机制保证了在可能引起混乱的情况下一个时刻  
  只有一个线程可以访问这个对象。Monitor必须和一个具体的对象相关联,但是由于它是一个静态的类,所以不能使用它来定义对象,而且它  
  的所有方法都是静态的,不能使用对象来引用。下面代码说明了使用Monitor锁定一个对象的情形:    
   
    ......    
    Queue   oQueue=new   Queue();    
    ......    
    Monitor.Enter(oQueue);    
    ......//现在oQueue对象只能被当前线程操纵了    
    Monitor.Exit(oQueue);//释放锁    
   
    如上所示,当一个线程调用Monitor.Enter()方法锁定一个对象时,这个对象就归它所有了,其它线程想要访问这个对象,只有等待它使  
  用Monitor.Exit()方法释放锁。为了保证线程最终都能释放锁,你可以把Monitor.Exit()方法写在try-catch-finally结构中的finally代码块  
  里。对于任何一个被Monitor锁定的对象,内存中都保存着与它相关的一些信息,其一是现在持有锁的线程的引用,其二是一个预备队列,队  
  列中保存了已经准备好获取锁的线程,其三是一个等待队列,队列中保存着当前正在等待这个对象状态改变的队列的引用。当拥有对象锁的  
  线程准备释放锁时,它使用Monitor.Pulse()方法通知等待队列中的第一个线程,于是该线程被转移到预备队列中,当对象锁被释放时,在预  
  备队列中的线程可以立即获得对象锁。
posted @ 2009-11-04 16:47  温景良(Jason)  Views(13400)  Comments(0Edit  收藏  举报