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