我正在尝试实现许多利用 ReaderWriterLockSlim 实现线程安全的属性。所以像大多数人一样,我最终在我的所有属性中都得到了这样的结果:
public string Name
{
get
{
rwLock.EnterReadLock();
try {
return name;
}
finally {
rwLock.ExitReadLock();
}
}
set
{
rwLock.EnterWriteLock();
try {
name = value;
}
finally {
rwLock.ExitWriteLock();
}
}
}
这在 10 个属性中感觉非常冗长和重复,因此我正在寻找更 DRY 的实现。
显而易见的解决方案是将它包装到一个类中,该类释放 dispose 的锁并允许我将线程安全操作放在 using 语句中。根据这个和其他一些来源,显然这不是很安全。
所以我尝试使用 lambda 表达式和匿名方法想出一个漂亮的解决方案:
private TResult ThreadSafeRead<TResult>(Func<TResult> value)
{
rwLock.EnterReadLock();
try {
return value();
}
finally {
rwLock.ExitReadLock();
}
}
private void ThreadSafeWrite(Action value)
{
rwLock.EnterWriteLock();
try {
value();
}
finally {
rwLock.ExitWriteLock();
}
}
public string Name
{
get { return ThreadSafeRead(() => name); }
set { ThreadSafeWrite(() => { name = value; }); }
}
虽然这消除了让我烦恼的重复代码,但我不知道它是否与我最初的详细实现一样线程安全。
是否有人对 MSIL 这将产生和多线程理论有更深入的了解,能够告诉我我的实现是否安全?