最近在园子里看到有关monitor实现线程同步的文章,正好最近的项目中要用到并发控制,所以就抽时间学习了一下monitor,之前都是不怎么写博客的,呵呵感觉花了时间去学习它,还是记下来比较好。。monitor我理解为是一个监视器,用来监视临界区域的信号量。学过操作系统的童鞋都应该知道这个概念哈~因为要通过信号量,所以要定义一个信号量,这里我们通常定义一个object类型的变量,注意这个变量一定要是一个公共的,并且是全局的,千万不能定义在临界区内~~~

View Code

class MonitorTest    {        MyServer.MyServerClient wcf = new MyServer.MyServerClient();        IMyServer ichan = null;        ChannelFactory<IMyServer> cha = new ChannelFactory<IMyServer>("BasicHttpBinding_IMyServer");object monitor = new object();public static int iCount = 0;public  MonitorTest()        {            cha.Open();            ichan = cha.CreateChannel();            wcf.CalculateCompleted += new EventHandler<MyServer.CalculateCompletedEventArgs>(wcf_CalculateCompleted);        }

void wcf_CalculateCompleted(object sender, MyServer.CalculateCompletedEventArgs e)        {            Console.WriteLine("我是线程{0}   "+"iCount的值为{1}",Thread.CurrentThread.Name,e.Result.ToString());        }

public void Test()        {            Thread t1 = new Thread(Test1);            t1.Name = "t1";

            Thread t2 = new Thread(Test2);            t2.Name = "t2";

           t1.Start();           t2.Start();

        }public void Test1()        {

for (int i = 0; i < 10; i++)            {                iCount++;                Console.WriteLine("我是线程{0}   " + "iCount的值为{1}", Thread.CurrentThread.Name, iCount);            }        }public void Test2()        {for (int i = 0; i < 10; i++)            {                iCount--;                Console.WriteLine("我是线程{0}   " + "iCount的值为{1}", Thread.CurrentThread.Name, iCount);            }        }    }

  本来想通过控制台项目添加wcf引用的,可是不知道为什么在调用服务了,没有任何反应,用fiddler工具也没有检测到任何的信息,所以,无奈之下,只好调用本地的方法,以后再研究研究。上面是没有加锁控制的,可以看到结果很混乱,谁抢到了谁就用。。显然不行。

   下面是加锁之后的效果:

    

View Code

class MonitorTest    {        MyServer.MyServerClient wcf = new MyServer.MyServerClient();        IMyServer ichan = null;        ChannelFactory<IMyServer> cha = new ChannelFactory<IMyServer>("BasicHttpBinding_IMyServer");object monitor = new object();public static int iCount = 0;public  MonitorTest()        {            cha.Open();            ichan = cha.CreateChannel();            wcf.CalculateCompleted += new EventHandler<MyServer.CalculateCompletedEventArgs>(wcf_CalculateCompleted);        }

void wcf_CalculateCompleted(object sender, MyServer.CalculateCompletedEventArgs e)        {            Console.WriteLine("我是线程{0}   "+"iCount的值为{1}",Thread.CurrentThread.Name,e.Result.ToString());        }

public void Test()        {            Thread t1 = new Thread(Test1);            t1.Name = "t1";

            Thread t2 = new Thread(Test2);            t2.Name = "t2";

           t1.Start();           t2.Start();

        }public void Test1()        {

lock (monitor)            {                Monitor.Pulse(monitor);for (int i = 0; i < 10; i++)                {                    iCount++;                    Console.WriteLine("我是线程{0}   " + "iCount的值为{1}", Thread.CurrentThread.Name, iCount);                }                Monitor.Wait(monitor);

            }        }public void Test2()        {lock (monitor)            {                Monitor.Pulse(monitor);for (int i = 0; i < 10; i++)                {                    iCount--;                    Console.WriteLine("我是线程{0}   " + "iCount的值为{1}", Thread.CurrentThread.Name, iCount);                }                Monitor.Wait(monitor);            }        }    }

转载于:https://www.cnblogs.com/zylEnjoyIT/archive/2012/03/20/2408825.html

Monitor线程同步相关推荐

  1. 线程同步 – lock和Monitor

    在多线程代码中,多个线程可能会访问一些公共的资源(变量.方法逻辑等等),这些公共资源称为临界区(共享区):临界区的资源是不安全,所以需要通过线程同步对多个访问临界区的线程进行控制. 同样,有些时候我们 ...

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

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

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

    多线程:C#线程同步lock,Monitor,Mutex,同步事件和等待句柄(上) 转自 http://www.cnblogs.com/freshman0216/archive/2008/07/27/ ...

  4. 改善C#程序的建议6:在线程同步中使用信号量

    所谓线程同步,就是多个线程之间在某个对象上执行等待(也可理解为锁定该对象),直到该对象被解除锁定.C#中对象的类型分为引用类型和值类型.CLR在这两种类型上的等待是不一样的.我们可以简单的理解为在CL ...

  5. C#线程同步的几种方法

    在网上也看过一些关于线程同步的文章,其实线程同步有好几种方法,下面我就简单的做一下归纳. 一.volatile关键字 volatile是最简单的一种同步方法,当然简单是要付出代价的.它只能在变量一级做 ...

  6. Java高级-线程同步机制实现

    2019独角兽企业重金招聘Python工程师标准>>> 前言 我们可以在计算机上运行各种计算机软件程序.每一个运行的程序可能包括多个独立运行的线程(Thread). 线程(Threa ...

  7. C#中的线程(二) 线程同步基础

    1.同步要领 下面的表格列展了.NET对协调或同步线程动作的可用的工具:                       简易阻止方法 构成 目的 Sleep 阻止给定的时间周期 Join 等待另一个线程 ...

  8. java线程 同步与异步 线程池

    1)多线程并发时,多个线程同时请求同一个资源,必然导致此资源的数据不安全,A线程修改了B线 程的处理的数据,而B线程又修改了A线程处理的数理.显然这是由于全局资源造成的,有时为了解 决此问题,优先考虑 ...

  9. Java线程(二):线程同步synchronized和volatile

    上篇通 过一个简单的例子说明了线程安全与不安全,在例子中不安全的情况下输出的结果恰好是逐个递增的(其实是巧合,多运行几次,会产生不同的输出结果),为什么 会产生这样的结果呢,因为建立的Count对象是 ...

  10. Java核心(三)并发中的线程同步与锁

    2019独角兽企业重金招聘Python工程师标准>>> 乐观锁.悲观锁.公平锁.自旋锁.偏向锁.轻量级锁.重量级锁.锁膨胀...难理解?不存的!来,话不多说,带你飙车. 上一篇介绍了 ...

最新文章

  1. 2021届图像/计算机视觉算法提前批的面经 | 附内推码
  2. python实现简单的api接口-Python实现简单的API接口
  3. 仿联想商城laravel实战---7、lavarel中如何给用户发送邮件
  4. 总结这阵子的FPGA工作
  5. Python ValueError: IO operation on closed file
  6. Netty(二)(入门篇)传统的Bio编程
  7. linux内存管理(十)-页表管理
  8. 在Microsoft-IIS/10.0上面部署mvc站点的时候,出现404的错误
  9. 《麦肯锡方法》读书笔记10
  10. 开心网之开心餐厅游戏分析报告
  11. 基于51单片机的智能温控风扇(程序+仿真+原理图)
  12. pc炉石传说显示无法联觉服务器,《炉石传说》酒馆战棋尤朵拉船长怎么玩 尤朵拉船长运营思路一览...
  13. HbuilderX 自有证书生成
  14. 学习Java的你知道什么是程序思维?
  15. 编码字符串,使得总长度最短
  16. 计算机网络—数据链路层
  17. 【R语言】ggplot2---散点图的边框和颜色填充问题
  18. 关于对《三只松鼠》网站的诊断报告
  19. u盘无法识别怎么办?看完不愁数据恢复
  20. 百度SEO和谷歌SEO有什么区别?

热门文章

  1. TDengine:A股分钟线数据的尝试
  2. 一些python书=待买
  3. Rust: codewars的prize draw算法
  4. 全面Severless化只需7天!看南瓜电影的云上极速升级
  5. 凝结11年技术实力 弹性计算国内首著发布
  6. php curl curloptcookiesession,curlopt_cookie问题
  7. 【水果识别】基于matlab GUI橙子数量识别【含Matlab源码 1821期】
  8. 【优化算法】先导粘菌算法(LSMA)【含Matlab源码 1436期】
  9. 【路径规划】基于matlab A_star算法机器人动态避障路径规划【含Matlab源码 1033期】
  10. 【跳频通信】基于matlab跳频通信系统仿真【含Matlab源码 967期】