我最近不得不使用ReaderWriterLockSlim
来同步对多个线程之间共享的多个资源的访问。在这样做的时候,我感觉使用ReaderWriterLockSlim
并不容易,特别是当你必须在多个地方使用它的时候。你必须有try...finally
块,并且记得打开和关闭锁。在许多情况下,我也发现自己打开了一个写锁并关闭了一个读锁,而不是关闭了写锁。因此,我试着想出一种使用ReaderWriterLockSlim
的更简单的方法。这就是我得到的
class Locked<T>
{
private T _resource;
private ReaderWriterLockSlim _lock;
public Locked(T resource)
{
_resource = resource;
_lock = new ReaderWriterLockSlim();
}
public void Read(Action<T> ReadAction)
{
try
{
_lock.EnterReadLock();
ReadAction(_resource);
}
finally
{
_lock.ExitReadLock();
}
}
public void Write(Action<T> WriteAction)
{
try
{
_lock.EnterWriteLock();
WriteAction(_resource);
}
finally
{
_lock.ExitWriteLock();
}
}
}
现在,例如,如果我们需要同步对List<string>
的访问,这就是我们使用上面的类实现的方法
public class Demo
{
private Locked<List<string>> _listOfString;
public Demo()
{
_listOfString = new Locked<List<string>>(new List<string>());
}
public void writeMethod(string value)
{
_listOfString.Write(list =>
{
list.Add(value);
});
}
public string readMethod(int index)
{
string value = null;
_listOfString.Read(list =>
{
value = list[index];
});
return value;
}
}
你认为这种方法会更好吗?是否有任何缺点或缺陷。
发布于 2011-07-20 08:18:22
我宁愿将锁定逻辑包装在IDisposable
中,并将您想要锁定的代码放在using块中,这与lock
语句非常相似:
class DisposableLock : IDisposable
{
Action _exitLock;
public DisposableLock(Action exitLock)
{
_exitLock = exitLock;
}
public void Dispose()
{
_exitLock();
}
}
class ReadLock : DisposableLock
{
public ReadLock(ReaderWriterLockSlim slimLock)
: base(() => slimLock.ExitReadLock())
{
slimLock.EnterReadLock();
}
}
class WriteLock : DisposableLock
{
public WriteLock(ReaderWriterLockSlim slimLock)
: base(() => slimLock.ExitWriteLock())
{
slimLock.EnterWriteLock();
}
}
您可以这样使用它:
using(new ReadLock(_lock))
{
// ... your synchronized operation
}
using(new WriteLock(_lock))
{
// ... your synchronized operation
}
https://stackoverflow.com/questions/6758858
复制