线程同步

如果其读操作很多但更新操作很少,则使用单一的锁限制并发性就不太合理了。这种情况常出现在业务应用服务器上,它会将常用的数据缓存在静态字段中进行快速检索。ReaderWriterLockSlim是专门为这种情形进行设计的,它可以最大限度地保证锁的可用性。
与常规的lock(Monitor.Enter/Exit)相比,ReaderWriterLockSlim的执行速度仍然慢一倍,但是它可以在大量的读操作和少量写操作的环境下减少锁竞争。
有时最好能在一个原子操作中将读锁转换为写锁。例如,我们希望当列表不包含特定元素时才将这个元素添加到列表中。一个可升级锁就像读锁一样,但是它可以在随后通过一个原子操作升级为一个写锁。以下是其使用方式:
1.调用EnterUpgradableReadLock。
2.执行读操作(例如,判断该元素是否已经存在于列表中)。
3.调用EnterWriteLock(该操作将可升级锁转化为写锁)。
4.执行基于写的操作(例如,将该元素添加到列表中)。
5.调用ExitWriteLock(将写锁转换回可升级锁)。
6.执行其他读操作。
7.调用ExitUpgradableReadLock。
ReaderWriterLockSlim释放读锁并获得一个写锁的操作是原子的。
可升级锁和读锁还有一个重要的区别:虽然可升级锁可以和任意数目的读锁并存,但是一次只能获取一个可升级锁。这可以将锁的升级竞争序列化从而避免在升级中出现死锁,这和SQL Server中的更新锁是一致的

 

信号量没有持有者这个概念,它是线程无关的。任何线程都可以调用Semaphore的Release方法
Mutex和lock则不然,只有持有锁的线程才能够释放锁。

ManualResetEvent适用于用一个线程来释放其他所有线程的情形,而CountdownEvent则适用于相反的情形。

 

EventWaitHandle构造器可以创建命名的实例以支持跨进程的操作。

 

Barrier类实现了一个线程执行屏障(thread execution barrier)。它允许多个线程在同一时刻汇合。这个类的执行速度很快,非常高效。它是基于Wait、Pulse和自旋锁实现的。

 

posted @ 2020-08-20 19:47  yetsen  阅读(74)  评论(0编辑  收藏  举报