1 /// <summary> 2 /// ReaderWriterLockSlim使用示例 3 /// </summary> 4 internal sealed class Transaction : IDisposable 5 { 6 //表示用于管理资源访问的锁定状态,可实现多线程读取或进行独占式写入访问 7 private readonly ReaderWriterLockSlim m_readerWriterLockSlim = new ReaderWriterLockSlim(LockRecursionPolicy.NoRecursion); 8 9 private DateTime m_timeOfLastTrans; 10 11 public void PerformTransaction() 12 { 13 //尝试进入写入模式锁定状态 14 m_readerWriterLockSlim.EnterWriteLock(); 15 16 //以下代码拥有对数据的独占访问权限 17 m_timeOfLastTrans = DateTime.Now; 18 19 // 减少写入模式的递归计数,并在生成的计数为 0(零)时退出写入模式 20 m_readerWriterLockSlim.ExitWriteLock(); 21 } 22 23 public DateTime LastTransaction 24 { 25 get 26 { 27 //尝试进入读取模式锁定状态 28 m_readerWriterLockSlim.EnterReadLock(); 29 30 //以下代码拥有对数据的共享访问权限 31 DateTime dateTime = m_timeOfLastTrans; 32 33 //减少读取模式的递归计数,并在生成的计数为 0(零)时退出读取模式 34 m_readerWriterLockSlim.ExitReadLock(); 35 36 return dateTime; 37 } 38 } 39 40 public void Dispose() 41 { 42 m_readerWriterLockSlim.Dispose(); 43 } 44 }
1.一个线程向数据写入时,请求访问的其它所有线程都被阻塞。
2.一个线程从数据读取时,请求读取的其它所有线程允许继续执行,但请求写入的所有线程仍被阻塞。
3.向数据写入的线程结束后,要么解除一个写入线程的阻塞,使它能向数据写入,要么解除所有读取线程的阻塞,使他们能并发读取数据。如果没有线程被阻塞,锁就进入可以自由使用的状态,可供下一个reader或writer线程获取。
4.从数据读取的所以线程结束后,一个writer线程被解除阻塞,使它能向数据写入。如果没有线程被阻塞,锁就进入可以自由使用的状态,可供下一个reader或writer线程获取。