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);
            }
        }

 

posted @ 2021-11-05 11:12  lunawzh  阅读(1086)  评论(0编辑  收藏  举报