资源上的多个 ReaderWriterLockSlim
Multiple ReaderWriterLockSlim on a Resource
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();
}
}
两种方法都很好。选择最好的一个需要了解锁的其他用途:锁定频率、锁定时间等。
直到有一定的性能瓶颈(通过分析发现),第二种(单锁)方法是首选:它永远不会死锁,所以你有较低的机会制作错误代码。
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();
}
}
两种方法都很好。选择最好的一个需要了解锁的其他用途:锁定频率、锁定时间等。
直到有一定的性能瓶颈(通过分析发现),第二种(单锁)方法是首选:它永远不会死锁,所以你有较低的机会制作错误代码。