Monitor 类通过向单个线程授予对象锁来控制对对象的访问。对象锁提供限制访问代码块(通常称为临界区)的能力。当一个线程拥有对象的锁时,其他任何线程都不能获取该锁。还可以使用 Monitor 来确保不会允许其他任何线程访问正在由锁的所有者执行的应用程序代码节,除非另一个线程正在使用其他的锁定对象执行该代码。

Monitor通过enter和exit函数的组合,可以等效lock效果

 Monitor.Enter(obj);
//...
Monitor.Exit(obj); lock(obj)
{
//...
}

对象锁等效

与lock不同在于,Monitor更加灵活,可以通过Wait/Pulse,形成线程间的同步管理。当前获取到锁的线程(TA)通过Wait函数,释放对锁的控制,并将当前线程挂起为阻塞状态。这个时候其他线程就可以对锁资源进行竞争(假设在众多线程中TB获取到锁)。TA只有在接收到TB的Pulse信号,才能重新进入就绪状态,重新竞争锁资源。

注意Pulse函数是通知当前等待队列中第一个,PulseAll是通知所有等待队列中的线程。

 Thread th2 = new Thread(() =>
{
lock (aysncLock)
{
Console.WriteLine("th2 enter will wait");
Monitor.Wait(aysncLock);
Console.WriteLine("th2 continue");
}
});
Thread th3 = new Thread(() =>
{
lock (aysncLock)
{
Console.WriteLine("th3 enter will wait");
Monitor.Wait(aysncLock);
Console.WriteLine("th3 continue");
}
});
Thread th1 = new Thread(() =>
{
Thread.Sleep(TimeSpan.FromSeconds());
lock (aysncLock)
{
Console.WriteLine("th1 enter will pulseall");
Console.WriteLine($"th1 tell: th2 state: [{th2.ThreadState}]");
Console.WriteLine($"th1 tell: th3 state: [{th3.ThreadState}]");
//Monitor.PulseAll(aysncLock);
Monitor.Pulse(aysncLock);
Console.WriteLine($"th1 tell: th2 state: [{th2.ThreadState}]");
Console.WriteLine($"th1 tell: th3 state: [{th3.ThreadState}]");
Console.WriteLine("th1 exit");
}
Console.WriteLine($"th1 tell: th2 state: [{th2.ThreadState}]");
Console.WriteLine($"th1 tell: th3 state: [{th3.ThreadState}]");
}); th1.Start();
th2.Start();
th3.Start();
Console.ReadKey();

使用Pulse结果:

th2、th3只有一个执行

使用PulseAll结果:

th2、th3均执行

[.net 多线程]Monitor的更多相关文章

  1. C#多线程---Monitor实现线程同步

    一.简介 Monitor.Enter和Monitor.Exit方法来实现线程同步,这个属于排他锁,即每次只有一个线程可以访问共享数据. C#中通过lock关键字来提供简化的语法,lock可以理解为Mo ...

  2. C# Monitor Wait()和Pulse()

    C# Monitor Wait()和Pulse()   1.Monitor.Wait方法当线程调用 Wait 时,它释放对象的锁并进入对象的等待队列,对象的就绪队列中的下一个线程(如果有)获取锁并拥有 ...

  3. C# 多线程限制方法调用(monitor)

    多线程执行方法 改方法没有执行完时 别的方法不能调用次方法.用循环执行一个方法可以需要一分钟 在这一分钟只内任何 成员都不能再调用该方法. class MonitorSample { ; //生产者和 ...

  4. C# 多线程详解 Part.04(Lock、Monitor、生产与消费)

           系列1 曾经说过:每个线程都有自己的资源,但代码区是共享的,即每个线程都可以执行相同的函数.        这可能带来的问题就是多个线程同时执行一个函数,并修改同一变量值,这将导致数据的 ...

  5. 重新想象 Windows 8 Store Apps (46) - 多线程之线程同步: Lock, Monitor, Interlocked, Mutex, ReaderWriterLock

    [源码下载] 重新想象 Windows 8 Store Apps (46) - 多线程之线程同步: Lock, Monitor, Interlocked, Mutex, ReaderWriterLoc ...

  6. C#使用Monitor类、Lock和Mutex类进行多线程同步

    在多线程中,为了使数据保持一致性必须要对数据或是访问数据的函数加锁,在数据库中这是很常见的,但是在程序中由于大部分都是单线程的程序,所以没有加锁的必要,但是在多线程中,为了保持数据的同步,一定要加锁, ...

  7. C# 多线程(lock,Monitor,Mutex,同步事件和等待句柄)

    本篇从 Monitor,Mutex,ManualResetEvent,AutoResetEvent,WaitHandler 的类关系图开始,希望通过本篇的介绍能对常见的线程同步方法有一个整体的认识,而 ...

  8. 多线程 - 线程同步锁(lock、Monitor)

    1. 前言 多线程编程的时候,我们不光希望两个线程间能够实现逻辑上的先后顺序运行,还希望两个不相关的线程在访问同一个资源的时候,同时只能有一个线程对资源进行操作,否则就会出现无法预知的结果. 比如,有 ...

  9. C#多线程的用法5-线程间的协作Monitor

    之前我们使用lock快捷方式,实现了多线程对同一资源的共享.在C#中lock实际上是Monitor操作的简化版本. 下面使用Monitor来完成之前的lock功能,你可以在此做一下对照: privat ...

随机推荐

  1. Spring Batch介绍

    简介 SpringBatch 是一个大数据量的并行处理框架.通常用于数据的离线迁移,和数据处理,⽀持事务.并发.流程.监控.纵向和横向扩展,提供统⼀的接⼝管理和任务管理;SpringBatch是Spr ...

  2. AngularJS:控制器

    ylbtech-AngularJS:控制器 1.返回顶部 1. AngularJS 控制器 AngularJS 控制器 控制 AngularJS 应用程序的数据. AngularJS 控制器是常规的  ...

  3. 巧妙的运用group,count,order有利于统计

    $aAwardMem = $this->dao_raward->getAwardAndMem($where,array('award_cat asc','award_level asc') ...

  4. Python之select模块解析

    首先列一下,sellect.poll.epoll三者的区别 select select最早于1983年出现在4.2BSD中,它通过一个select()系统调用来监视多个文件描述符的数组,当select ...

  5. bash shell笔记4 处理用…

    原创作品,允许转载,转载时请务必以超链接形式标明文章 原始出处 .作者信息和本声明.否则将追究法律责任.http://twentyfour.blog.51cto.com/945260/521448 知 ...

  6. Properties & Method

    [Properties] 1.lazy property,通过@property来定义, lazy property的属性直到使用的时候才初始化: 2.Computed Properties: 2.对 ...

  7. 使用laravel实现用户的登陆

    首先在 php artisan 里面 make:auth 生产一个门脸类 修改配置文件里面要哪个模型登陆 模型得继承一下才能 先写一下注册 密码必须要使用laravel的加密方法,使用MD5都没用 l ...

  8. 824. Goat Latin山羊拉丁文

    [抄题]: A sentence S is given, composed of words separated by spaces. Each word consists of lowercase ...

  9. js 操作table

    <%@ Page Language="C#" AutoEventWireup="true" CodeFile="Default4.aspx.cs ...

  10. 几个常用的HTTP状态码

    200:客户端请求成功 302:临时跳转,跳转的地址通过Location指定 400:客户端请求有语法错误,不能被服务器识别 403:服务器收到请求,但是拒绝提供服务 404:请求的资源不存在 500 ...