C#多线程---Monitor实现线程同步
2024-08-31 16:57:43
一、简介
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秒后打印出信息,也就是说只有当前的锁释放了,其他的线程才能访问共享数据。
但实际上,我们读取数据的时候是不需要排他的。
最新文章
- c++ vector struct 使用
- 输入一个整型数组,数据元素有正数也有负数,求元素组合成连续子数组之和最大的子数组,要求时间复杂度为O(n)。
- svg DOM的一些js操作
- Git+GitHub 使用小结
- BZOJ 3511 土地划分
- MVC4 Forms 验证,部署到Hyper-v上.FormsAuthentication.SetAuthCookie无效的问题
- C# 缓存学习第一天
- 备份数据表为insert 脚本
- ZOJ 3603字符串操作
- OpenGL编程指南第版本学习笔记 --- OpenGL程序实现过程(win32 + OpenGL)
- TFS2010升级至TFS2013完全指南
- Sublime Text保存文件时自动去掉行末空格
- 关于json对象的深拷贝
- [ipsec][crypto] 在IPSec ESP使用AES-GCM加密时的IV
- [开源 .NET 跨平台 Crawler 数据采集 爬虫框架: DotnetSpider] 学习
- 2017-2018-2 20165231实验二《Java面向对象程序设计》实验报告
- Python之os模块和sys模块
- PCB编译时出现的错误 ( Duplicate Net Names Wire N000-1 (Inferred)意思就是端口名字没有定义)
- mac mysql提示mysql.sock&#39;
- React绑定事件动态化的实现方法