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

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM