zoukankan      html  css  js  c++  java
  • 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);
                }
            }
  • 相关阅读:
    一些常用的方法(1)--去除DataTable中的重复数据
    皕杰报表入门知识(1)
    Red Hat 6.0 Linux系统跳过登录界面直接进入系统
    解决pycharm无法获取安装包文件列表
    sqlalchemy创建数据库自动映射
    python3使用importlib来重复加载模块
    python3使用exec来动态加载模块
    中间件datasnap用流传递数据
    使用fdmemTable来代替clientDataset,解决MySQL5.6(含)以上版本用cds多次更新时的错误
    dxSpreadSheet动态切换Sheet
  • 原文地址:https://www.cnblogs.com/lunawzh/p/15512304.html
Copyright © 2011-2022 走看看