本文主要讲解.Net基于ReaderWriterLockSlim讲解读写锁


基础概念

  • 读写锁是一个具有特殊用途的线程锁,适用于频繁读取且读取需要一定时间的场景,共享资源的读取操作通常是可以同时执行的,
  • 普通的互斥锁不管是获取还是修改操作无法同时执行,如果多个线程为了读取操作而获取互斥锁,那么同一时间只有一个线程可以执行读取操作,
  • 频繁读取的场景下回对吞吐量造成影响
  • 读写锁把锁分为读取锁和写入锁,线程可以根据对共享资源的操作类型获取读取锁还是写入锁,读取锁可以被多个线程同时获取,写入锁不可以被多个线程
  • 同时获取,且读取锁和写入锁不可以被不同的线同时获取,
操作 读取锁状态 写入锁状态 获取锁是否需要等待
获取读取锁 未获取 未获取 无需等待
获取读取锁 已被其他线程获取 未获取 无需等待
获取读取锁 未获取 已被其他线程获取 需要等待其他线程释放
获取写入锁 未获取 未获取 无需等待
获取写入锁 已被其他线程获取 未获取 需要等待其他线程释放
获取写入锁 未获取 已被其他线程获取 需要等待其他线程释放

代码示例

 class Program
{
static void Main(string[] args)
{
var c = ReadWriteLockDemo.GetValue("value", x =>
{
Console.WriteLine(x);
return x;
}); Console.WriteLine("结束了");
Console.WriteLine($@"获取到的结果为:{c}");
}
}
public static class ReadWriteLockSimpleDemo
{
private static ReaderWriterLockSlim _lock = new ReaderWriterLockSlim(); private static int _countA = 0; public static int _countB = 0; /// <summary>
/// 增加
/// </summary>
public static void IncrementCounters()
{
_lock.EnterWriteLock();
try
{
++_countA;
++_countB;
}
finally
{ _lock.ExitWriteLock();
}
} /// <summary>
/// 获取
/// </summary>
/// <param name="countA"></param>
/// <param name="countB"></param>
public static void GetCounters(ref int countA, ref int countB)
{
_lock.EnterReadLock();
try
{
countA = _countA;
countB = _countB;
}
finally
{
_lock.ExitReadLock();
}
}
}

升级版


public static class ReadWriteLockDemo
{
private static ReaderWriterLockSlim _lock = new ReaderWriterLockSlim();
private static Dictionary<string, string> _dict = new Dictionary<string, string>(); public static string GetValue(string key, Func<string, string> factory)
{
_lock.EnterUpgradeableReadLock();
try
{
//值已生成时可以直接返回
if (_dict.TryGetValue(key, out var value))
{
return value;
}
//获取(升级到)写入锁
_lock.EnterWriteLock();
try
{
//再次判断值是否已生成
if (!_dict.TryGetValue(key, out value))
{
value = factory(key);
_dict.Add(key, value);
}
return value;
}
finally
{
//释放写入锁
_lock.ExitWriteLock();
}
}
finally
{
//释放读取锁
_lock.ExitUpgradeableReadLock();
}
}
}

本文基于.Net Core底层入门总结内容

如有哪里讲得不是很明白或是有错误,欢迎指正

如您喜欢的话不妨点个赞收藏一下吧

一文带你了解.Net读写锁的更多相关文章

  1. 【并发编程】一文带你读懂深入理解Java内存模型(面试必备)

    并发编程这一块内容,是高级资深工程师必备知识点,25K起如果不懂并发编程,那基本到顶.但是并发编程内容庞杂,如何系统学习?本专题将会系统讲解并发编程的所有知识点,包括但不限于: 线程通信机制,深入JM ...

  2. 一文带你读懂什么是vxlan网络

    一个执着于技术的公众号 一.背景 随着云计算.虚拟化相关技术的发展,传统网络无法满足大规模.灵活性要求高的云数据中心的要求,于是便有了overlay网络的概念.overlay网络中被广泛应用的就是vx ...

  3. 一文带你读懂zookeeper在大数据生态的应用

    一个执着于技术的公众号 一.简述 在一群动物掌管的世界中,动物没有人类聪明的思想,为了保持动物世界的生态平衡,这时,动物管理员-zookeeper诞生了. 打开Apache zookeeper的官网, ...

  4. 实战 | 一文带你读懂Nginx反向代理

    一个执着于技术的公众号 前言 在前面的章节中,我们已经学习了nginx基础知识: 给小白的 Nginx 10分钟入门指南 Nginx编译安装及常用命令 完全卸载nginx的详细步骤 Nginx 配置文 ...

  5. 一道面试题比较synchronized和读写锁

    一.科普定义 这篇博文的两个主角“synchronized”和“读写锁” 1)synchronized 这个同步关键字相信大家都用得比较多,在上一篇“多个线程之间共享数据的方式”中也详细列举他的应用, ...

  6. 读写锁:ReadWriteLock

    http://my.oschina.net/20076678/blog/173165   一.在JDK文档中关于读写锁的相关说明 ReadWriteLock 维护了一对相关的 锁 ,一个用于只读操作, ...

  7. <转>一道面试题比较synchronized和读写锁

    一.科普定义(原文:http://903497571.iteye.com/blog/1874752) 这篇博文的两个主角“synchronized”和“读写锁” 1)synchronized 这个同步 ...

  8. PHP程序中的文件锁、互斥锁、读写锁使用技巧解析

    文件锁全名叫 advisory file lock, 书中有提及. 这类锁比较常见,例如 mysql, php-fpm 启动之后都会有一个pid文件记录了进程id,这个文件就是文件锁. 这个锁可以防止 ...

  9. java 可重入读写锁 ReentrantReadWriteLock 详解

    详见:http://blog.yemou.net/article/query/info/tytfjhfascvhzxcyt206 读写锁 ReadWriteLock读写锁维护了一对相关的锁,一个用于只 ...

随机推荐

  1. mock请求时出现中文乱码的解决

    请求返回的乱码如图: 原mock代码如下 [ { "description":"这是我们的第一个mock例子", "request":{ & ...

  2. 812考试总结(NOIP模拟37)[数列·数对·最小距离·真相]

    前言 考得挺憋屈的... 先是搞了两个半小时的 T1 后来发现假了,又没多想跳了.. 然后一看 T2 这不是队长快跑嘛... 先是根据自己的想法打了一遍(考完之后发现是对的..) 然后回想了一下之前的 ...

  3. 使用Cobertura做代码覆盖率测试

    经验总结:首先要把cobertura.jar包含ant的classpath路径中,其次要求它包含在测试用例的classpath中: 使用cobertura做代码覆盖率测试中出现的问题:覆盖率始终为0, ...

  4. mac 软件意外退出

    大概率的原因是软件签名问题. 先安装 xcode xcode-select --install 然后签名 sudo codesign --force --deep --sign - 文件位置(直接将应 ...

  5. 安全工具推荐之Goby篇

    Goby(鰕虎鱼) 这个东西出来也很久了,有一年多了吧,个人感觉用起来还不错(当然见仁见智哈,别喷我),今天拿来水一篇 官网有很详细的使用说明,所以本文纯属发表一下感慨,非技术贴 官网在此:https ...

  6. NOIP 模拟 $11\; \rm biology$

    题解 首先对 \(a\) 离散化,则可推出转移方程 \[dp_{i,j}=\max\{{dp_{{i^{'}},{j^{'}}}+|i-i^{'}|+|j-j^{'}|}\}+b_{i,j} \;\; ...

  7. AECC2018同时中英文切换多开使用,加倍提高你的工作效率

    最近相信不少人已经更新了AECC2018,升级之后第一件重要的事当然是中英文的切换了,要不然工作中很麻烦.对于一直习惯用中文的人来说,在用模板过程中会出现各种表达式报错极其不方便,而对于习惯英文操作朋 ...

  8. nginx 实现反向代理、负载均衡、高可用

    转自:https://blog.csdn.net/zy1471162851/article/details/91795712 tip:   nginx是一款高性能的http 服务器/反向代理服务器及电 ...

  9. python运算符,内置函数简单使用

    1.编写程序,输入任意大的自然数,输出各位数字之和. 2.编写程序,输入两个集合 setA 和 setB,分别输出它们的交集.并集和差集 setA-setB. 3.编写程序,输入一个自然数,输出它的二 ...

  10. JDBC中的元数据

    在我编写JDBC代码的时候:出现很多的重复的代码,有没有什么办法让我们能够编写出更加通用的JDBC代码呢?使用元数据,元数据能够让我们编写出更加通用的JDBC代码.什么是元数据呢?(三种元数据)1)连 ...