C#多线程---Monitor实现线程同步

一、简介

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 }
View Code

运行结果如下:

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

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

转载于:https://www.cnblogs.com/3xiaolonglong/p/9650136.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值