一、简介

当我们需要对一个共享资源多次读取的时候,用前面Monitor的同步锁就没有必要了。因为同步锁每次只允许一个线程访问共享资源,其他线程都会阻塞。

此时,通过ReaderWriterLock类可以很好的实现读取并行。

二、例子

 1 using System;
2 using System.Threading;
3
4 namespace ThreadMonitor
5 {
6 class Program
7 {
8 private static object lockObj = new object();
9 private static ReaderWriterLock readerwritelock = new ReaderWriterLock();
10 static void Main(string[] args)
11 {
12 for (int i = 0; i < 10; i++)
13 {
14 Thread testthread = new Thread(Add);
15 testthread.IsBackground = true;
16 testthread.Start();
17 }
18
19 for (int i = 0; i < 10; i++)
20 {
21 Thread testthread2 = new Thread(Read);
22 testthread2.IsBackground = true;
23 testthread2.Start();
24 }
25 Console.WriteLine("All thread created done!");
26 Console.Read();
27 }
28
29 // 共享资源
30 public static int number = 1;
31
32 public static void Add()
33 {
34 //Monitor.Enter(lockObj); //获得排他锁,每次只有一个线程可以进入
35 readerwritelock.AcquireWriterLock(50000);
36 Console.ForegroundColor = ConsoleColor.DarkGreen;
37 Console.WriteLine($"{DateTime.Now} CurrentThreadIDAdd:{Thread.CurrentThread.ManagedThreadId} CurrentValue:{number++}" );
38 Thread.Sleep(2000);
39 Console.ResetColor();
40 //Monitor.Exit(lockObj);
41 readerwritelock.ReleaseWriterLock();
42
43 }
44 public static void Read()
45 {
46 //Monitor.Enter(lockObj); //获得排他锁
47 readerwritelock.AcquireReaderLock(50000);
48 Console.ForegroundColor = ConsoleColor.DarkRed;
49 Console.WriteLine($"{DateTime.Now} CurrentThreadIDRead:{Thread.CurrentThread.ManagedThreadId} CurrentValue:{number}");
50 Thread.Sleep(2000);
51 Console.ResetColor();
52 readerwritelock.ReleaseReaderLock();
53 //Monitor.Exit(lockObj);// 释放指定对象上的排他锁。
54
55 }
56 }
57 }

运行结果如下:

C#多线程---ReaderWriterLock实现线程同步的更多相关文章

  1. .NET面试题解析(07)-多线程编程与线程同步

      系列文章目录地址: .NET面试题解析(00)-开篇来谈谈面试 & 系列文章索引 关于线程的知识点其实是很多的,比如多线程编程.线程上下文.异步编程.线程同步构造.GUI的跨线程访问等等, ...

  2. java核心知识点学习----多线程并发之线程同步

    1.什么是线程同步? 多线程编程是很有趣的事情,它很容易出现"错误情况",这种情况不是由编码造成的,它是由系统的线程调度造成的,当使用多个线程来访问同一个数据时,很容易出现&quo ...

  3. .NET面试题解析(07)-多线程编程与线程同步 (转)

    http://www.cnblogs.com/anding/p/5301754.html 系列文章目录地址: .NET面试题解析(00)-开篇来谈谈面试 & 系列文章索引 关于线程的知识点其实 ...

  4. 细说C#多线程那些事 - 线程同步和多线程优先级

    上个文章分享了一些多线程的一些基础的知识,今天我们继续学习. 一.Task类 上次我们说了线程池,线程池的QueueUserWorkItem()方法发起一次异步的线程执行很简单 但是该方法最大的问题是 ...

  5. Win32多线程编程(3) — 线程同步与通信

      一.线程间数据通信 系统从进程的地址空间中分配内存给线程栈使用.新线程与创建它的线程在相同的进程上下文中运行.因此,新线程可以访问进程内核对象的所有句柄.进程中的所有内存以及同一个进程中其他所有线 ...

  6. C# 多线程编程第二步——线程同步与线程安全

    上一篇博客学习了如何简单的使用多线程.其实普通的多线程确实很简单,但是一个安全的高效的多线程却不那么简单.所以很多时候不正确的使用多线程反倒会影响程序的性能. 下面先看一个例子 : class Pro ...

  7. java多线程二之线程同步的三种方法

          java多线程的难点是在:处理多个线程同步与并发运行时线程间的通信问题.java在处理线程同步时,常用方法有: 1.synchronized关键字. 2.Lock显示加锁. 3.信号量Se ...

  8. Java多线程与并发——线程同步

    1.多线程共享数据 在多线程的操作中,多个线程有可能同时处理同一个资源,这就是多线程中的共享数据. 2.线程同步 解决数据共享问题,必须使用同步,所谓同步就是指多个线程在同一时间段内只能有一个线程执行 ...

  9. Java多线程编程(4)--线程同步机制

    一.锁 1.锁的概念   线程安全问题的产生是因为多个线程并发访问共享数据造成的,如果能将多个线程对共享数据的并发访问改为串行访问,即一个共享数据同一时刻只能被一个线程访问,就可以避免线程安全问题.锁 ...

随机推荐

  1. Java基础00-继承17

    1. 继承 1.1 继承概述 但是我们将相同的类提取出来就会变成这个样子 让他们之间产生一个继承的关系 1.2 继承的好处和弊端 IS-A.HAS-A和USE-A关系 苹果是水果的一种可以使用继承猫是 ...

  2. MySQL服务不见 - 解决方法

    因为开发需要,今天安装了PHPStudy服务.导致以前的MySQL服务在服务表里面不见了.通过查阅网址的资料解决了,那么赶快记录下来 1. 确认当前的系统是管理员身份 2. 切换到MySQL数据库的安 ...

  3. 2018年成为Web开发者的路线图

    本文通过一组大图展示了Web开发技能图谱,给出了作为Web 开发者可以采取的路径,以及总结了想要成为Web工程师的朋友们.希望和大家一起交流分享 介绍 Web 开发的角色一般说来,包括前端.后端和de ...

  4. vue 快速入门 系列 —— vue loader 扩展

    其他章节请看: vue 快速入门 系列 vue loader 扩展 在vue loader一文中,我们学会了从零搭建一个简单的,用于单文件组件开发的脚手架.本篇将在此基础上继续引入一些常用的库:vue ...

  5. springboot-4-CRUD开发实战

    流程: 创建项目,勾选基本的几个开发工具还有webstarter 再创建包(service,control,config,dao,pojo) 再前往https://www.webjars.org/,选 ...

  6. idea创建web工程、配置tomcat及基本配置

    背景 现在许多人从eclipse转到idea了,小编也不例外.但是刚转初期还是有挺多不适应的,特总结了创建maven的web工程.配置tomcat服务器及基本配置.有了这些配置,上手idea也就跟ec ...

  7. maven 与profile,resources,properties 关系

    top 的 pom.xml 看<profiles>的标签 <profiles> <!--dat环境--> <profile> <id>DAT ...

  8. 如何获取SQL Server数据库连接字符串的某些部分

    有的时候需要获取SQL Server数据库连接字符串的某些部分.用正则表达式可能有点麻烦. 其实有一个比较简单的方法--使用SqlConnectionStringBuilder. var builde ...

  9. Java的equsals和==

    先上结论:在我们常用的类中equals被重写后,作用就是为了比较对象的内容,==是比较对象的内存地址.但并不能说所有的equals方法就是比较对象的内容. Java 中的==: 1.对于对象引用类型: ...

  10. 字节跳动已经10万人了?渣本双非Android程序员怎么上车?

    字节跳动已经 10 万人了? 是的,在 2020 年字节跳动的员工总数从 6 万蹿到 10 万,平均每个工作日就有 150 人在办理入职,加入字节跳动全球超过 240 个办公点. 更有统计,在总部北京 ...