Несколько 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 ответ

Решение

Оба подхода хороши. Выбор лучшего требует знания других способов использования замков: как часто они закрываются, как долго и т. Д.

До тех пор, пока не возникнет определенное узкое место в производительности (найденное с помощью профилирования), предпочтителен второй подход (одиночная блокировка): он никогда не страдает от тупиковой ситуации, поэтому у вас меньше шансов создать ошибочный код.

Другие вопросы по тегам