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

兩種方法都很好。選擇最好的一個,需要對鎖的其他用途知識:他們是如何經常被鎖定,等了多久

直到有一定的性能比較瓶頸(通過分析發現),第二(單鎖)是更可取的:它從來沒有遭受死鎖,所以你有更低的機會做出錯誤的代碼。