并发数据(锁)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
原文地址:https://www.cnblogs.com/zcm123/p/3326129.html