c#读写锁ReaderWriterLockSlim
表示用于管理资源访问的锁定状态,可实现多线程读取或进行独占式写入访问
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); } }