我必须实现一些涉及不同线程访问的共享资源的.Net代码。原则上,这应该通过简单的读写锁来解决。但是,我的解决方案要求某些读取访问最终会产生写入操作。我首先检查了ReaderWriterLockSlim,但它本身并没有解决问题,因为它要求我事先知道读操作是否可以变成写操作,而这不是我的情况。我最后选择只使用ReaderWriterLockSlim,当读取操作“检测到”需要执行写操作时,释放读锁并获取写锁。我不确定是否有更好的解决方案或事件,如果此解决方案可能导致某些同步问题(我有Java经验,但我对.Net相当新。)
下面是一些说明我的解决方案的示例代码:
public class MyClass
{
private int[] data;
private readonly ReaderWriterLockSlim syncLock = new ReaderWriterLockSlim();
public void modifyData()
{
try
{
syncLock.EnterWriteLock();
// clear my array and read from database...
}
finally
{
syncLock.ExitWriteLock();
}
}
public int readData(int index)
{
try
{
syncLock.EnterReadLock();
// some initial preprocessing of the arguments
try
{
_syncLock.ExitReadLock();
_syncLock.EnterWriteLock();
// check if a write is needed <--- this operation is fast, and, in most cases, the result will be false
// if true, perform the write operation
}
finally
{
_syncLock.ExitWriteLock();
_syncLock.EnterReadLock();
}
return data[index];
}
finally
{
syncLock.ExitReadLock();
}
}
}