所谓锁,就是之锁定的区域只能单个线程进入进行操作,其他线程在锁的外围等待。
Monitor锁通过Monitor.Enter(obj)和Monitor.Exit(obj)来锁定和解锁。
Lock锁则直接Lock(obj)进行锁定。
Monitor锁和Lock锁很类似,实质Lock锁是Monitor的变体。
lock(obj)
{
}
等价为:
try
{    
   Monitor.Enter(obj) 
}
catch()
{}
finally
{
   Monitor.Exit(obj) 
}
所以lock能做的,Monitor肯定能做,Monitor能做的,lock不一定能做。
下面讲一下Monitor的特殊与Lock功能。
Monitor.Enter(obj);// 启动锁
Monitor.TryEnter(obj, );//启动锁,也是区别于Lock的功能,多了一个时间设置,就是等待多少时间后如果还不能进入,则取消此次操作。Lock则会一直等待下去。
Monitor.Wait(obj);// 会放弃当前线程对资源的所有权,让别的线程到lock进来。然后当别的线程代码里Pulse一下(让原线程进入到等待队列),之后从Waint()后面继续运行下去
Monitor.Pulse(obj);// 恢复原放弃资源控制权的线程,使其重新进入到等待队列中,下次直接从Wait()后继续运行。
Monitor.PulseAll(obj);// 恢复所有曾今放弃资源控制权的线程,使其重新进入到等待队列中
Monitor.Exit(obj);// 结束锁
例子:
        [MethodImpl(MethodImplOptions.Synchronized)]
private void FirstThread()
{
//Monitor.Enter(this);
Monitor.Wait(this);
MessageBox.Show("FirstThread");
//Monitor.Exit(this);
}
private void SecondThread()
{
Monitor.Enter(this);
Monitor.Wait(this);
MessageBox.Show("SecondThread");
Monitor.Pulse(this);
Monitor.Exit(this);
}
private void ThirdThread()
{
Monitor.Enter(this);
MessageBox.Show("ThirdThread");
Monitor.Pulse(this);
Monitor.Exit(this);
}

调用:

Thread thread = new Thread(new ThreadStart(FirstThread));
thread.Name = "thread1";
Thread thread2 = new Thread(new ThreadStart(SecondThread));
hread2.Name = "thread2";
Thread thread3 = new Thread(new ThreadStart(ThirdThread));
thread3.Name = "thread3";
thread.Start();
thread2.Start();
thread3.Start();

运行结果:

首先线程会进入到FirstThread方法,然后因为Wait了,所以线程1放弃所有权,然后线程2进入SecondThread,因为也Wait了,所以线程3进入ThirdThread,然后会MessageBox弹出“TirdThread”,之后运行Pulse,所以释放了线程2,所以线程2会MessageBox弹出“SecondThread”,之后再释放线程1弹出“FirstThread”。

每一个锁都必须要有Enter和Exit,里面参数是一个Object类型,是一个锁的标识。

在这FirstThread方法中没有使用Enter和Exit而是使用了

[MethodImpl(MethodImplOptions.Synchronized)]
这个作用相当于在这个方法开始和结尾处分别加上了Enter和Exit。

【C#】【Thread】Monitor和Lock的更多相关文章

  1. 第十三节:实际开发中使用最多的监视锁Monitor、lock语法糖的扩展、混合锁的使用(ManualResetEvent、SemaphoreSlim、ReaderWriterLockSlim)

    一. 监视锁(Monitor和lock) 1. Monitor类,限定线程个数的一把锁,两个核心方法: Enter:锁住某个资源. Exit:退出某一个资源. 测试案例:开启5个线程同时对一个变量进行 ...

  2. C#知识点总结系列:4、C#中Monitor和Lock以及区别

    Monitor对象 1.Monitor.Enter(object)方法是获取锁,Monitor.Exit(object)方法是释放锁,这就是Monitor最常用的两个方法,当然在使用过程中为了避免获取 ...

  3. C#中Monitor和Lock以及区别

    Monitor对象 1.Monitor.Enter(object)方法是获取锁,Monitor.Exit(object)方法是释放锁,这就是Monitor最常用的两个方法,当然在使用过程中为了避免获取 ...

  4. 锁、C#中Monitor和Lock以及区别

    1.Monitor.Enter(object)方法是获取锁,Monitor.Exit(object)方法是释放锁,这就是Monitor最常用的两个方法,当然在使用过程中为了避免获取锁之后因为异常,致锁 ...

  5. C#知识点总结:Monitor和Lock以及区别

    Monitor对象 1.Monitor.Enter(object)方法是获取锁,Monitor.Exit(object)方法是释放锁,这就是Monitor最常用的两个方法,当然在使用过程中为了避免获取 ...

  6. Monitor和Lock以及区别

    1.Monitor.Enter(object)方法是获取锁,Monitor.Exit(object)方法是释放锁,这就是Monitor最常用的两个方法,当然在使用过程中为了避免获取锁之后因为异常,致锁 ...

  7. Thread Based Parallelism - Thread Synchronization With Lock

    Thread Based Parallelism - Thread Synchronization With Lock import threading shared_resource_with_lo ...

  8. 转:C# 线程同步技术 Monitor 和Lock

    原文地址:http://www.cnblogs.com/lxblog/archive/2013/03/07/2947182.html 今天我们总结一下 C#线程同步 中的 Monitor 类 和 Lo ...

  9. Java线程同步的Monitor机制(Lock配合Condition)

    Monitor模式是一种常见的并行开发机制, 一个Monitor实例可以被多个线程安全使用, 所有的monitor下面的方法在运行时是互斥的, 这种互斥机制机制可以用于一些特性, 例如让线程等待某种条 ...

随机推荐

  1. 实验12:Problem D: 判断两个圆之间的关系

    Home Web Board ProblemSet Standing Status Statistics   Problem D: 判断两个圆之间的关系 Problem D: 判断两个圆之间的关系 T ...

  2. Cent OS 6.4安装mysql

    Cent OS6.4 RPM安装mysql 一.卸载掉原有mysql 因为目前主流Linux系统版本基本上都集成了mysql数据库在里面 如下命令来查看我们的操作系统上是否已经安装了mysql数据库 ...

  3. IOS 计步器

    这篇博客介绍的是当前比较流行的“计步器”-只是简单的知识点 计步器的实现在IOS8开始进行了改变. 但是我会对之前之后的都进行简单介绍. IOS 8 - // // ViewController.m ...

  4. GCD中使用dispatch_after函数延迟处理任务

    在实际的开发中,经常会遇到想要在指定的时间间隔后执行某个处理 <一>在GCD中提供了dispatch_after函数来完成这一操作 dispatch_after(dispatch_time ...

  5. Apple Pay(转)

    Apple Pay 是在 iOS 8 中第一次被介绍,它可以为你的应用中的实体商品和服务,提供简单.安全.私密的支付方式.它使得用户支付起来非常简便,只需按一下指纹就可以授权进行交易. Apple P ...

  6. C语言-06-复杂数据类型

    一.数组 1> 数组的定义和初始化 定义 ① 数组定义了同种类型数据的集合 ② 定义数组时,数组必须有固定的长度 初始化 ① 如果在定义数组时,初始化数组,数组元素的个数必须是常量 ② 如果不在 ...

  7. Monyer's Game 11~15关过关方法

    到目前为止,玩这个小游戏并过关的人数已经达到了81人,首先Monyer要感谢各位的捧场与支持.继续上次的<Monyer's Game 6~10关过关方法>,我们来看剩下几关的过关方法. 但 ...

  8. Centos 源配置 163,epel,mysql

    http://mirrors.163.com/.help/centos.html CentOS7-Base-163.repo # CentOS-Base.repo # # The mirror sys ...

  9. 关于PHP中Session文件过多的问题

    PHP的默认机制:每一次php请求,会有1/100的概率(默认值)触发“session回收”.如果“session回收”发生,那就会检查/tmp/sess_*的文件,如果最后的修改时间到现在超过了14 ...

  10. Java锁(一)之内存模型

    想要了解Java锁机制.引发的线程安全问题以及数据一致性问题,有必要了解内存模型,机理机制了解清楚了,这些问题也就应声而解了. 一.主内存和工作内存 Java内存模型分为主内存和工作内存,所有的变量都 ...