zoukankan      html  css  js  c++  java
  • 线程同步

    如果其读操作很多但更新操作很少,则使用单一的锁限制并发性就不太合理了。这种情况常出现在业务应用服务器上,它会将常用的数据缓存在静态字段中进行快速检索。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和自旋锁实现的。

  • 相关阅读:
    关于直播的技术整理2
    关于直播的技术整理
    android drawable size
    Could not find gradle wrapper within android sdk
    基于开源Red5搭建的视频直播平台
    Cannot find module 'rxjs/operators/share'
    Cannot find type definition file for '.svn'
    Ionic国际化解决方案
    本博客停止更新改用wordperss
    Powershell批量安装SNMP服务
  • 原文地址:https://www.cnblogs.com/yetsen/p/13546862.html
Copyright © 2011-2022 走看看