0

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

如果我调用'BMethod'和'ABMethod'的第二种方法,两者都不能同时写入?你是否真的需要同时锁定两个,你能采取一个你需要的然后拿走另一个吗? –

+0

@ScottChamberlain,你会建议用所有3种方法(AMethod,BMethod,ABMethod)中的单个锁定对象替换两个锁定对象protDataA和protDataB吗?即使A对象正在改变,该线程也会等待访问B对象。 –

回答

1

两种方法都很好。选择最好的一个,需要对锁的其他用途知识:他们是如何经常被锁定,等了多久

直到有一定的性能比较瓶颈(通过分析发现),第二(单锁)是更可取的:它从来没有遭受死锁,所以你有更低的机会做出错误的代码。