zoukankan      html  css  js  c++  java
  • 并发数据(锁)ReaderWriterLockSlim

    ReaderWriterLockSlim 类

    ReaderWriterLockSlim 类支持三种锁定模式:Read,Write,UpgradeableRead。这三种模式对应的方法分别是 EnterReadLock,EnterWriteLock,EnterUpgradeableReadLock 。再就是与此对应的 TryEnterReadLock,TryEnterWriteLock,TryEnterUpgradeableReadLock,ExitReadLock,ExitWriteLock,ExitUpgradeableReadLock。Read 和 Writer 锁定模式比较简单易懂:Read 模式是典型的共享锁定模式,任意数量的线程都可以在该模式下同时获得锁;Writer 模式则是互斥模式,在该模式下只允许一个线程进入该锁。UpgradeableRead 锁定模式可能对于大多数人来说比较新鲜,但是在数据库领域却众所周知。

    这个新的读写锁类性能跟 Monitor 类大致相当,大概在 Monitor 类的 2 倍之内。而且新锁优先让写线程获得锁,因为写操作的频率远小于读操作。通常这会导致更好的可伸缩性。起初,ReaderWriterLockSlim 类在设计时考虑到相当多的情况。比如在早期 CTP 的代码还提供了PrefersReaders, PrefersWritersAndUpgrades 和 Fifo 等竞争策略。但是这些策略虽然添加起来非常简单,但是会导致情况非常的复杂。所以 Microsoft 最后决定提供一个能够在大多数情况下良好工作的简单模型。

    #线程可以进入三种锁定模式:读取模式、写入模式和可升级的读取模式。

    #可升级模式适用于线程通常读取受保护资源的内容,但在某些条件满足时可能需要写入的情况。使用可升级锁可以方便的从读锁中升级为写锁,而不需要进行切换,以增加损耗。

    # 平时不要把ReaderWriterLockSlim的实例放到try{}块中,以减少性能损耗。

    例如:

    public class ReaderWriterLockSlimSample
    {
        private static ReaderWriterLockSlim rwLock = new ReaderWriterLockSlim();

        private object Get()
        {
            object obj = null;
            if (rwLock.TryEnterReadLock(100))
            {
                try
                {
                    //写操作
                    obj = new object();
                    return obj;
                }
                finally
                {
                    rwLock.ExitReadLock();
                }
            }
            return null;
        }
        private void Add()
        {
            if (rwLock.TryEnterWriteLock(100))
            {
                try
                {
                    //写操作
                }
                finally
                {
                    rwLock.ExitWriteLock();
                }
            }
        }
        public void Update()
        {
            if (rwLock.TryEnterUpgradeableReadLock(100))
            {
                try
                {
                    //读操作
                    rwLock.EnterWriteLock();
                    try
                    {
                        //写操作
                    }
                    finally
                    {
                        rwLock.ExitWriteLock();
                    }
                }
                finally
                {
                    rwLock.ExitUpgradeableReadLock();
                }
            }

        }
    }
    2.http://blog.csdn.net/deng375235329/archive/2009/11/24/4864546.aspx
  • 相关阅读:
    bzoj4476: [Jsoi2015]送礼物
    牛客练习赛42 E.热爆了
    bzoj3561: DZY Loves Math VI
    bzoj3560: DZY Loves Math V
    bzoj3512: DZY Loves Math IV
    bzoj3481: DZY Loves Math III
    使用WebUploader本地生成缩略图
    centos 7 安装JDK1.8
    APK反编译
    centos 7 配置pytorch运行环境
  • 原文地址:https://www.cnblogs.com/zcm123/p/3326129.html
Copyright © 2011-2022 走看看