.Net ReaderWriterLockSlim 锁 电脑版发表于:2022/4/20 11:47 ![.netcore](https://img.tnblog.net/arcimg/hb/c857299a86d84ee7b26d181a31e58234.jpg ".netcore") >#.Net ReaderWriterLockSlim 锁 [TOC] tn2>读写锁的概念很简单,允许多个线程同时获取读锁,但同一时间只允许一个线程获得写锁,因此也称作共享-独占锁。 ```csharp public class ReadWriteLockDemo { public static ReaderWriterLockSlim readerwritelock = new ReaderWriterLockSlim(); public static long i =0; public void Read(long value) { readerwritelock.EnterReadLock(); Thread.Sleep(5000); Debug.WriteLine($"Thread ID :{Thread.CurrentThread.ManagedThreadId} Read Lock Value:{i} Time:{DateTime.Now}"); readerwritelock.ExitReadLock(); } public void Write(long value) { readerwritelock.EnterWriteLock(); Thread.Sleep(5000); i = value; Debug.WriteLine($"Thread ID :{Thread.CurrentThread.ManagedThreadId} Write Lock Value:{i} Time:{DateTime.Now}"); readerwritelock.ExitWriteLock(); } public void Read(long value,int millisecondsTimeout) { //三秒内没执行将会自动释放 bool islock = readerwritelock.TryEnterReadLock(millisecondsTimeout); if (islock) { Thread.Sleep(5000); Debug.WriteLine($"Thread ID :{Thread.CurrentThread.ManagedThreadId} Read Lock Value:{i} Time:{DateTime.Now} IsLock:{islock}"); readerwritelock.ExitReadLock(); } } public void Write(long value, int millisecondsTimeout) { bool islock = readerwritelock.TryEnterWriteLock(millisecondsTimeout); if (islock) { Thread.Sleep(5000); i = value; Debug.WriteLine($"Thread ID :{Thread.CurrentThread.ManagedThreadId} Write Lock Value:{i} Time:{DateTime.Now} IsLock:{islock}"); readerwritelock.ExitWriteLock(); } } } ``` ##场景一 tn2>只要前面那个写入线程没有释放,每次写都需要阻塞(排队等)。(10个读写线程,每次处理需要花5秒) ```csharp [Test] public void TestReadWriteLock() { ReadWriteLockDemo readWriteLockDemo = new ReadWriteLockDemo(); List<Task> list = new List<Task>(); for (int i = 0; i < 10; i++) { int a = i; Task task = new Task(() => { readWriteLockDemo.Write(a); readWriteLockDemo.Read(a); }); task.Start(); list.Add(task); } Task.WaitAll(list.ToArray()); } ``` ![](https://img.tnblog.net/arcimg/hb/551c3163516a4784b3a304312f2f596f.png) ##场景二 tn2>只要前面那个写入线程没有释放,它叫我和其他线程等它3秒钟,3秒等完了还是没处理完我们走了,3秒内处理完了轮到我了我就上,或者轮到其他线程那个线程上,我们走了。 ```csharp [Test] public void TestReadWriteLockTimeOut() { ReadWriteLockDemo readWriteLockDemo = new ReadWriteLockDemo(); List<Task> list = new List<Task>(); for (int i = 0; i < 10; i++) { int a = i; Task task = new Task(() => { readWriteLockDemo.Write(a,3000); readWriteLockDemo.Read(a, 3000); }); task.Start(); list.Add(task); } Task.WaitAll(list.ToArray()); } ``` ![](https://img.tnblog.net/arcimg/hb/4c23ac2f1ee142bfbe2a177cec733252.png) tn2>我们这里改改,我们不急可以等100秒.这样我们就都可以等到处理完成。 ```csharp readWriteLockDemo.Write(a,100000); ``` ![](https://img.tnblog.net/arcimg/hb/993e46c504fe4a2a8da3b8eba72b3508.png)