一、简介

Monitor.Enter和Monitor.Exit方法来实现线程同步,这个属于排他锁,即每次只有一个线程可以访问共享数据。

C#中通过lock关键字来提供简化的语法,lock可以理解为Monitor.Enter和Monitor.Exit方法的语法糖。

二、例子

 1 using System;
2 using System.Threading;
3
4 namespace ThreadMonitor
5 {
6 class Program
7 {
8 private static object lockObj = new object();
9 private static ReaderWriterLock readerwritelock = new ReaderWriterLock();
10 static void Main(string[] args)
11 {
12 for (int i = 0; i < 10; i++)
13 {
14 Thread testthread = new Thread(Add);
15 testthread.IsBackground = true;
16 testthread.Start();
17 }
18
19 for (int i = 0; i < 10; i++)
20 {
21 Thread testthread2 = new Thread(Read);
22 testthread2.IsBackground = true;
23 testthread2.Start();
24 }
25 Console.WriteLine("All thread created done!");
26 Console.Read();
27 }
28
29 // 共享资源
30 public static int number = 1;
31
32 public static void Add()
33 {
34
35 Monitor.Enter(lockObj); //获得排他锁,每次只有一个线程可以进入
36 Console.ForegroundColor = ConsoleColor.DarkGreen;
37 // readerwritelock.AcquireWriterLock(50000);
38 Console.WriteLine($"{DateTime.Now} CurrentThreadIDAdd:{Thread.CurrentThread.ManagedThreadId} CurrentValue:{number++}" );
39 Thread.Sleep(2000);
40 //readerwritelock.ReleaseWriterLock();
41 // 释放指定对象上的排他锁。
42 Console.ResetColor();
43 Monitor.Exit(lockObj);
44
45 }
46 public static void Read()
47 {
48
49 Monitor.Enter(lockObj); //获得排他锁
50 //readerwritelock.AcquireReaderLock(50000);
51 Console.ForegroundColor = ConsoleColor.DarkRed;
52 Console.WriteLine($"{DateTime.Now} CurrentThreadIDRead:{Thread.CurrentThread.ManagedThreadId} CurrentValue:{number}");
53 Thread.Sleep(2000);
54 //readerwritelock.ReleaseReaderLock();
55
56 Console.ResetColor();
57 Monitor.Exit(lockObj);// 释放指定对象上的排他锁。
58
59 }
60 }
61 }

运行结果如下:

从结果中可以看出,无论读写线程,都会在2秒后打印出信息,也就是说只有当前的锁释放了,其他的线程才能访问共享数据。

但实际上,我们读取数据的时候是不需要排他的。

最新文章

  1. c++ vector struct 使用
  2. 输入一个整型数组,数据元素有正数也有负数,求元素组合成连续子数组之和最大的子数组,要求时间复杂度为O(n)。
  3. svg DOM的一些js操作
  4. Git+GitHub 使用小结
  5. BZOJ 3511 土地划分
  6. MVC4 Forms 验证,部署到Hyper-v上.FormsAuthentication.SetAuthCookie无效的问题
  7. C# 缓存学习第一天
  8. 备份数据表为insert 脚本
  9. ZOJ 3603字符串操作
  10. OpenGL编程指南第版本学习笔记 --- OpenGL程序实现过程(win32 + OpenGL)
  11. TFS2010升级至TFS2013完全指南
  12. Sublime Text保存文件时自动去掉行末空格
  13. 关于json对象的深拷贝
  14. [ipsec][crypto] 在IPSec ESP使用AES-GCM加密时的IV
  15. [开源 .NET 跨平台 Crawler 数据采集 爬虫框架: DotnetSpider] 学习
  16. 2017-2018-2 20165231实验二《Java面向对象程序设计》实验报告
  17. Python之os模块和sys模块
  18. PCB编译时出现的错误 ( Duplicate Net Names Wire N000-1 (Inferred)意思就是端口名字没有定义)
  19. mac mysql提示mysql.sock&#39;
  20. React绑定事件动态化的实现方法

热门文章

  1. WIN10 网卡驱动异常代码56的问题及解决方法
  2. python 读注册表 检测NET版本
  3. CentOS 7安装Python3 笔记
  4. odoo里面条件写法
  5. 快速设置 JAVA_HOME
  6. zabbix latest.php SQL注入漏洞(CVE-2016-10134)
  7. HttpRunner3源码阅读:4. loader项目路径加载,用例文件转换、方法字典生成
  8. SQL SERVER获取表在哪些存储过程中使用过
  9. SpringBoot - 根据目录结构自动生成路由前缀
  10. Bugku-你必须让他停下来