• 线程同步


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

  • 相关阅读:
    Nginx 部署多个 web 项目(虚拟主机)
    Nginx 配置文件
    Linux 安装 nginx
    Linux 安装 tomcat
    Linux 安装 Mysql 5.7.23
    Linux 安装 jdk8
    Linux 安装 lrzsz,使用 rz、sz 上传下载文件
    springMVC 拦截器
    spring 事务
    基于Aspectj 注解实现 spring AOP
  • 原文地址:https://www.cnblogs.com/yetsen/p/13546862.html
Copyright © 2020-2023  润新知