Monitor 类】的更多相关文章

官方备注: Monitor类通过向单个线程授予对象所来控制对对象的访问.对象所提供限制访问代码块的能力.当一个线程拥有对象的锁时,其他任何线程都不能获取该锁.还可以使用Monitor来确保不会允许其他任何线程访问正在由锁的所有者执行的应用程序代码,除非另一个线程正在使用其他的锁定对象执行改代码. Monitor类调用Enter或TryEnter方法获取对象锁,使用Exit放弃对象锁,在Enter/TryEnter和Exit之间可调用Pause/PauseAll或Wait方法,Wait方法的调用会…
线程:线程是进程的独立执行单元,每一个进程都有一个主线程,除了主线程可以包含其他的线程.多线程的意义:多线程有助于改善程序的总体响应性,提高CPU的效率.多线程的应用程序域是相当不稳定的,因为多个线程在同一时间内都能运行共享的功能模块.为了保护应用程序的资源不被破坏,为多线程程序提供了三种加锁的机制,分别是:Monitor类.Lock关键字和Mutex类.1. locklock实现的功能是:使后进入的线程不会中断当前的线程,而是等待当前线程结束后再继续执行.应用:代码如下: private Ob…
Monitor 类锁定一个对象 当多线程公用一个对象时,也会出现和公用代码类似的问题,这种问题就不应该使用lock关键字了,这里需要用到System.Threading中的一个类Monitor,我们可以称之为监视器,Monitor提供了使线程共享资源的方案. Monitor类可以锁定一个对象,一个线程只有得到这把锁才可以对该对象进行操作.对象锁机制保证了在可能引起混乱的情况下一个时刻只有一个线程可以访问这个对象. Monitor必须和一个具体的对象相关联,但是由于它是一个静态的类,所以不能使用它…
在多线程中,为了使数据保持一致性必须要对数据或是访问数据的函数加锁,在数据库中这是很常见的,但是在程序中由于大部分都是单线程的程序,所以没有加锁的必要,但是在多线程中,为了保持数据的同步,一定要加锁,好在Framework中已经为我们提供了三个加锁的机制,分别是Monitor类.Lock关键字和Mutex类.         其中Lock关键词用法比较简单,Monitor类和Lock的用法差不多.这两个都是锁定数据或是锁定被调用的函数.而Mutex则多用于锁定多线程间的同步调用.简单的说,Mon…
最近,在维护以前老系统的时候,发现了这样一个错误:Object synchronization method was called from an unsynchronized block of code. 由于是老系统,代码是Framework 1.0的版本,距离现在都快10年了.很多以前的DLL源代码,都无法找到.只能根据抛出的异常信息,从网上查询资料. 调查后,发现这个问题是由于Monitor抛出的,最后反编译抛出异常的DLL,证实了这个猜测. MSDN上,在Monitor类介绍中,对本文…
前面我们讲过了lock的用法以及竞争条件导致的错误,实际上lock关键字是Monitor类用例的一个语法糖.如果我们分解使用了lock关键字的代码,将会看到它如下面代码片段所示: bool acquireLock = false; try { Monitor.Enter(lockObject, ref acquireLock); //Code that access resources that are protected by the lock. } finally { if (acquire…
一.线程状态 二.线程优先级 三.初步尝试多线程 class Program { static void Main(string[] args) { while (true) { MessagePrinter p1=new MessagePrinter(); Thread t1 = new Thread(new ThreadStart(p1.Print)); t1.Name = "t1"; t1.Priority = ThreadPriority.Highest; MessagePri…
关于对C#多线程类Monitor的理解 1.对线程的理解 围绕着锁周围的线程可以分为以下三类: l  拥有锁的线程:只有一个 l  就绪队列:只有就绪队列里的线程才有机会在锁被释放时去获取锁. l  等待队列:没有资格去获取锁. 2.Monitor.Wait(obj)方法 当线程调用 Wait 时,它释放对象的锁并进入对象的等待队列,对象的就绪队列中的下一个线程(如果有)获取锁并拥有对对象的独占使用. Wait(obj)就是交出锁的使用权,把自己移到等待队列里,处于阻塞状态,当再次获得锁时(得先…
object obj=new object(); Monitor在锁对象obj上会维持两个线程队列R和W以及一个引用T : (1) T是对当前获得了obj锁的线程的引用(设此线程为CurrThread); (2) R为就绪队列,其上的线程已经准备好获取obj锁.当obj锁被CurrThread释放后(CurrThread可通过Monitor.Exit(obj)或Monitor.Wait(obj)来释放其所获的obj锁)这些线程就会去竞争obj锁,获得obj锁的线程将被T引用; 线程调用Monit…
命名空间:System.Threading 程序集: mscorlib.dll, System.Threading.dll 尝试获取指定对象的排他锁. 用于 Monitor 锁定对象 (即引用类型) ,而不是值类型. 有关详细信息,请参阅 Monitor 文章. 若要确保线程不输入临界区,应检查方法的返回值,并仅在临界区中执行代码,前提是其返回值为 true . 下面的代码段显示了用于调用此方法的模式. 请注意,应 Exit 在块中调用 finally ,以确保调用线程在发生异常的情况下释放其对…