【发布时间】:2015-07-20 16:08:59
【问题描述】:
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();
}
}
【问题讨论】:
-
如果我打电话给
BMethod和ABMethod的第二种方法,什么会阻止两者同时写入?另外,你真的需要同时打开两个锁吗?你可以先拿一个做你需要的然后再拿另一个吗? -
@ScottChamberlain ,您是否建议在所有 3 种方法(AMethod、BMethod、ABMethod)中将两个锁定对象 protDataA 和 protDataB 替换为单个锁定对象?即使 A 对象发生变化,线程也会等待访问 B 对象。
标签: c# multithreading thread-safety locking readerwriterlockslim