资源上的多个ReaderWriterLockSlim

时间:2015-07-20 16:09:00

标签: c# multithreading thread-safety locking readerwriterlockslim

ReaderWriterLockSlim允许使用锁来管理对资源的访问,允许多个线程进行读取或独占访问以进行写入。目前我们有以下代码:

public ReaderWriterLockSlim protDataA = new ReaderWriterLockSlim(LockRecursionPolicy.SupportsRecursion);
        public ReaderWriterLockSlim protDataB = new ReaderWriterLockSlim(LockRecursionPolicy.SupportsRecursion);
        public void AMethod(ClassA Aobject )
        {
            try
            {
                protDataA.EnterWriteLock();
                //change A-typed-object
            }
            finally
            { protDataA.ExitWriteLock(); }
        }
        public void BMethod(ClassB Bobject)
        {
            try
            {
                protDataB.EnterWriteLock();
                //change B-typed-object
            }
            finally
            { protDataB.ExitWriteLock(); }
        }

现在,如果我需要保护A和B类型对象的数据应该是什么方法和为什么?

//Approach-1 - Making multiple locks on a single block
public void ABMethod(ClassA Aobject, ClassB Bobject)
            {
                try
                {
                    protDataA.EnterWriteLock();
                    protDataB.EnterWriteLock();
                    //change A-typed-object
                    //change B-typed-object
                }
                finally
                {
                    protDataA.ExitWriteLock();
                    protDataB.ExitWriteLock();
                }
            }

    //Approach-2 - Or Making a single lock would serve the same purpose ?
            public void ABMethod(ClassA Aobject, ClassB Bobject)
            {
                try
                {
                    protDataA.EnterWriteLock();
                    //change A-typed-object
                    //change B-typed-object
                }
                finally
                {
                    protDataA.ExitWriteLock();
                }
            }

1 个答案:

答案 0 :(得分:1)

两种方法都很好。选择最好的一个需要了解锁的其他用法:它们被锁定的频率,持续时间等等。

直到存在某个性能瓶颈(通过分析找到),第二种(单一锁定)方法是首选:它从不遭受死锁,因此您制作错误代码的机会较低。< / p>