一、简介
Monitor.Enter和Monitor.Exit方法来实现线程同步,这个属于排他锁,即每次只有一个线程可以访问共享数据。
C#中通过lock关键字来提供简化的语法,lock可以理解为Monitor.Enter和Monitor.Exit方法的语法糖。
二、例子
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
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秒后打印出信息,也就是说只有当前的锁释放了,其他的线程才能访问共享数据。
但实际上,我们读取数据的时候是不需要排他的。