一文带你了解.Net读写锁

本文主要讲解.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读写锁的更多相关文章
- 【并发编程】一文带你读懂深入理解Java内存模型(面试必备)
并发编程这一块内容,是高级资深工程师必备知识点,25K起如果不懂并发编程,那基本到顶.但是并发编程内容庞杂,如何系统学习?本专题将会系统讲解并发编程的所有知识点,包括但不限于: 线程通信机制,深入JM ...
- 一文带你读懂什么是vxlan网络
一个执着于技术的公众号 一.背景 随着云计算.虚拟化相关技术的发展,传统网络无法满足大规模.灵活性要求高的云数据中心的要求,于是便有了overlay网络的概念.overlay网络中被广泛应用的就是vx ...
- 一文带你读懂zookeeper在大数据生态的应用
一个执着于技术的公众号 一.简述 在一群动物掌管的世界中,动物没有人类聪明的思想,为了保持动物世界的生态平衡,这时,动物管理员-zookeeper诞生了. 打开Apache zookeeper的官网, ...
- 实战 | 一文带你读懂Nginx反向代理
一个执着于技术的公众号 前言 在前面的章节中,我们已经学习了nginx基础知识: 给小白的 Nginx 10分钟入门指南 Nginx编译安装及常用命令 完全卸载nginx的详细步骤 Nginx 配置文 ...
- 一道面试题比较synchronized和读写锁
一.科普定义 这篇博文的两个主角“synchronized”和“读写锁” 1)synchronized 这个同步关键字相信大家都用得比较多,在上一篇“多个线程之间共享数据的方式”中也详细列举他的应用, ...
- 读写锁:ReadWriteLock
http://my.oschina.net/20076678/blog/173165 一.在JDK文档中关于读写锁的相关说明 ReadWriteLock 维护了一对相关的 锁 ,一个用于只读操作, ...
- <转>一道面试题比较synchronized和读写锁
一.科普定义(原文:http://903497571.iteye.com/blog/1874752) 这篇博文的两个主角“synchronized”和“读写锁” 1)synchronized 这个同步 ...
- PHP程序中的文件锁、互斥锁、读写锁使用技巧解析
文件锁全名叫 advisory file lock, 书中有提及. 这类锁比较常见,例如 mysql, php-fpm 启动之后都会有一个pid文件记录了进程id,这个文件就是文件锁. 这个锁可以防止 ...
- java 可重入读写锁 ReentrantReadWriteLock 详解
详见:http://blog.yemou.net/article/query/info/tytfjhfascvhzxcyt206 读写锁 ReadWriteLock读写锁维护了一对相关的锁,一个用于只 ...
随机推荐
- 【Lua篇】静态代码扫描分析(三)语法分析
一.语法分析 通过将词法分析获取的Token流按照目标语言的语法进行解析的过程,例如解析函数声明.函数调用.变量声明.各种语句等. 二.Lua语法分析 在写语法分析程序前,先需要了解Lua的语句和语法 ...
- Notes about multiboot usb creator
U盘上的多系统启动工具,Windows上YUMI比较好,Ubuntu上MultiSystem用法复杂,unetbootin是另外一款,需要安装p7zip(apt-get install p7zip-f ...
- 21JavaScript笔记(1)
JavaScript 基于对象和事件驱动 简单描述性语言 函数优先 解释型(即时编译型) 具有安全性的脚本语言 1.js组成 核心语法(ECMAScript):开放的.标准的脚本语言规范,主要包含了语 ...
- Java基础技术多线程与并发面试【笔记】
Java基础技术多线程与并发 什么是线程死锁? 死锁是指两个或两个以上的进程(线程)在执行过程中,由于竞争资源或者由于彼此通信而造成的一种阻塞的现象,若无外力作用,它们都将无法推进下去,我们就可以称 ...
- 零基础学Java之Java学习笔记(三):变量和数据类型
为什么需要变量? 变量是一个程序的基本组成单位. 变量的概念: 变量相当于内存中一个数据存储空间的表示,你可以把变量看做是一个房间的门牌号,通过门牌号我们可以找到房 间,而通过变量名可以访问到变量(值 ...
- 联合迭代器与生成器,enumerate() 内置函数真香!
花下猫语:Python 中很多内置函数的作用都非常大,比如说 enumerate() 和 zip(),它们使得我们在作迭代操作时极为顺手.这是一篇很多年前的 PEP,提议在 Python 2.3 版本 ...
- 高效编程:在IntelliJ IDEA中使用VIM
硬核干货分享,欢迎关注[Java补习课]成长的路上,我们一起前行 ! <高可用系列文章> 已收录在专栏,欢迎关注! 概述 Vim是一个功能强大.高度可定制的文本编辑器; 具体有多强大,我现 ...
- Nebula 2.5.0安装过程及遇到的坑
2021年8月23日,Nebula 发布了最新版本:2.5.0,正好赶上新环境部署,记录一下安装过程及遇到的坑: 一.准备工作 以下安装使用nebula用户,搭建集群模式,一共三台机器:192.168 ...
- 题解 Prime
传送门 考场上魔改了一下线性筛,觉得要筛到 \(\frac{R}{2}\) 就没让它跑 其实正解就是这样,只不过由于接下来类似埃氏筛的过程只要筛到根号就行了 线性筛有的时候其实并不需要筛到 \(\fr ...
- windows上python3安装
下载python 下载地址 https://www.python.org/downloads/windows/ 安装python 1.添加python到环境变量 2.自定义安装 3.下一步 4.选择安 ...