表示用於管理資源訪問的鎖定狀態,可實現多線程讀取或進行獨占式寫入訪問
ReaderWriterLockSlim 類支持三種鎖定模式:Read,Write,UpgradeableRead。這三種模式對應的方法分別是 EnterReadLock,EnterWriteLock,EnterUpgradeableReadLock 。再就是與此對應的 TryEnterReadLock,TryEnterWriteLock,TryEnterUpgradeableReadLock,ExitReadLock,ExitWriteLock,ExitUpgradeableReadLock。Read 和 Writer 鎖定模式比較簡單易懂:Read 模式是典型的共享鎖定模式,任意數量的線程都可以在該模式下同時獲得鎖;Writer 模式則是互斥模式,在該模式下只允許一個線程進入該鎖。UpgradeableRead 鎖定模式可能對於大多數人來說比較新鮮,但是在數據庫領域卻眾所周知。
1、對於同一把鎖、多個線程可同時進入讀模式。
2、對於同一把鎖、同時只允許一個線程進入寫模式。
3、對於同一把鎖、同時只允許一個線程進入可升級的讀模式
不管遞歸策略如何,在任何時候都只能有一個線程處於寫入模式。 當線程處於寫入模式時,任何其他線程都不能在任何模式下進入鎖定狀態。 在任何時候,只能有一個線程處於可升級模式。 任意數量的線程都可以處於讀取模式,並且在其他線程處於讀取模式時,可以有一個處於可升級模式的線程。
static async Task Main(string[] args) { ReaderWriterLockSlim _lock = new ReaderWriterLockSlim(); List<int> list = new List<int>() { 0 }; List<Task> tasks = new List<Task>(); for (int i = 0; i < 10; i++) { var task = Task.Run(async () => { await Task.Delay(new Random().Next(1000)); _lock.EnterUpgradeableReadLock(); var max = list.Max(); try { _lock.EnterWriteLock(); try { list.Add(++max); } finally { _lock.ExitWriteLock(); } } finally { _lock.ExitUpgradeableReadLock(); } }); tasks.Add(task); } await Task.WhenAll(tasks); foreach (var item in list) { Console.WriteLine(item); } }