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. Java并发--CountDownLatch CyclicBarrier ReentrantLock

    CountDownLatch CountDownLatch是一个同步工具类,它允许一个或多个线程一直等待,直到其他线程的操作执行完后再执行.CountDownLatch使用一个数字count初始化,使 ...

  2. Annotation之三:自定义注解示例,利用反射进行解析

    @Retention定义了该Annotation被保留的时间长短有3中RetentionPolicy.SOURCE源文件有效,RetentionPolicy.CLASS:在class文件中有效,Ret ...

  3. 理解contextmanager

    同事在查看网络问题导致虚拟机状态一直pause时,在一段代码(见以下)处产生了疑惑.问我,我也是一头雾水.后同事找到参考文章(1),算是了解了个大概.而我对contextmanager的工作产生了兴趣 ...

  4. matlab神经网络工具箱创建神经网络

    为了看懂师兄的文章中使用的方法,研究了一下神经网络 昨天花了一天的时间查怎么写程序,但是费了半天劲,不能运行,百度知道里倒是有一个,可以运行的,先贴着做标本 % 生成训练样本集 clear all; ...

  5. timequest学习之黑金动力(一)

    黑金动力的资料还是非常有价值的.通过建模篇,对于给定的时序关系,我总能实现.但是,这总是很初级的能力.也只是为后面的建模服务.所以,现阶段我的能力还是非常有限.我相信我一定会成为牛人,能够独挡一面.借 ...

  6. 用css实现图片在div内的垂直居中

    已知一个div内有一个img,两者的高度均不知道,但图片的高度一定小于div的高度 代码如下: .box { /*非IE的主流浏览器识别的垂直居中的方法*/ display: table-cell;  ...

  7. Deep Learning 学习笔记(7):神经网络的求解 与 反向传播算法(Back Propagation)

    反向传播算法(Back Propagation): 引言: 在逻辑回归中,我们使用梯度下降法求参数方程的最优解. 这种方法在神经网络中并不能直接使用, 因为神经网络有多层参数(最少两层),(?为何不能 ...

  8. Cygwin windows10上安装出现系列问题及解决方法

    问题1描述: 发现vim不好使,Backspace键只是前移,不能删除,按方向键更是按出ABCD来.   解决方法: $ cp /usr/share/vim/vim73/vimrc_example.v ...

  9. WEB前端必备掌握知识

    1.跨域: 跨域问题是由于javascript语言安全限制中的同源策略造成的.

  10. C++学习路线(转载)

    随着互联网及互联网+深入蓬勃的发展,经过40余年的时间洗礼,C/C++俨然已成为一门贵族语言,出色的性能使之成为高级语言中的性能王者.而在今天,它又扮演着什么样重要的角色呢?请往下看: 后端服务器,移 ...