一文带你了解.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读写锁维护了一对相关的锁,一个用于只 ... 
随机推荐
- 随着日益增多的新技术,Android开发接下来的路该怎么走?
			很多小伙伴们经常问我android移动开发者的走向,一部分人都想多快好省,间歇性踌躇满志.持续性混吃等死 ,只想用CV的开发模式们快速完成工作,然后回家王者农药.其实这种现象很普遍,我想告诉你的是 , ... 
- Android茫茫半年求职路,终于斩获三个大厂offer
			前言 2019年底,公司出现危机,开始"优化",本组一个小兄弟被"优化",于是我也着手开始做准备,将来若轮到我被"优化",出去面试时也好打个 ... 
- git submodule 操作
			git submodule foreach git status 举一反三,对所有子库的操作,都可以使用 git submodule foreach 做前缀 foreach,可以记忆为for each ... 
- 一键部署lamp脚本
			#!/bin/bash systemctl stop firewalld systemctl disable firewalld setenforce 0 #-------Apache------ # ... 
- 蓝桥杯练习-各大OJ平台介绍
			校赛准备的不够充分,简单题失分太遗憾, 有幸参加到省赛,这次先码一下练习平台,等学期结束忙完之后好好练习! 1.题库与网站资源题库-在线提交系统(Online Judge)简介 下面是几个比较大的 ... 
- MySQL JOIN的使用
			JOIN的使用 JOIN 理论 MySQL 七种 JOIN 的 SQL 编写 环境搭建 # 创建部门表 CREATE TABLE tbl_dept ( id INT NOT NULL AUTO_INC ... 
- jsoup的Document类
			一.简介 Document是一个装载html的文档类,它是jsoup一个非常重要的类.类声明:public class Document extends Element .Document是Node间 ... 
- MongoDB学习笔记二- Mongoose
			MongoDB学习笔记二 Mongoose Mongoose 简介 之前我们都是通过shell来完成对数据库的各种操作, 在开发中大部分时候我们都需要通过程序来完成对数据库的操作 而Mongoose就 ... 
- win命令
			netstat -nao | findstr "8888"taskkill /pid 15064 /f清理端口被占用win+r进入cmdcmd窗口中输入notepad进入记事本sh ... 
- go defer关键字使用规则
			defer 用于延迟函数的调用,每次defer都会把一个函数压入栈中,函数返回前再把延迟的函数取出并执行 数据结构 type _defer struct { sp uintptr //函数栈指针 pc ... 
