C#多线程---Monitor实现线程同步
一、简介
Monitor.Enter和Monitor.Exit方法来实现线程同步,这个属于排他锁,即每次只有一个线程可以访问共享数据。
C#中通过lock关键字来提供简化的语法,lock可以理解为Monitor.Enter和Monitor.Exit方法的语法糖。
二、例子
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
35 Monitor.Enter(lockObj); //获得排他锁,每次只有一个线程可以进入
36 Console.ForegroundColor = ConsoleColor.DarkGreen;
37 // readerwritelock.AcquireWriterLock(50000);
38 Console.WriteLine($"{DateTime.Now} CurrentThreadIDAdd:{Thread.CurrentThread.ManagedThreadId} CurrentValue:{number++}" );
39 Thread.Sleep(2000);
40 //readerwritelock.ReleaseWriterLock();
41 // 释放指定对象上的排他锁。
42 Console.ResetColor();
43 Monitor.Exit(lockObj);
44
45 }
46 public static void Read()
47 {
48
49 Monitor.Enter(lockObj); //获得排他锁
50 //readerwritelock.AcquireReaderLock(50000);
51 Console.ForegroundColor = ConsoleColor.DarkRed;
52 Console.WriteLine($"{DateTime.Now} CurrentThreadIDRead:{Thread.CurrentThread.ManagedThreadId} CurrentValue:{number}");
53 Thread.Sleep(2000);
54 //readerwritelock.ReleaseReaderLock();
55
56 Console.ResetColor();
57 Monitor.Exit(lockObj);// 释放指定对象上的排他锁。
58
59 }
60 }
61 }
运行结果如下:
从结果中可以看出,无论读写线程,都会在2秒后打印出信息,也就是说只有当前的锁释放了,其他的线程才能访问共享数据。
但实际上,我们读取数据的时候是不需要排他的。
C#多线程---Monitor实现线程同步的更多相关文章
- .NET面试题解析(07)-多线程编程与线程同步
系列文章目录地址: .NET面试题解析(00)-开篇来谈谈面试 & 系列文章索引 关于线程的知识点其实是很多的,比如多线程编程.线程上下文.异步编程.线程同步构造.GUI的跨线程访问等等, ...
- .NET面试题解析(07)-多线程编程与线程同步 (转)
http://www.cnblogs.com/anding/p/5301754.html 系列文章目录地址: .NET面试题解析(00)-开篇来谈谈面试 & 系列文章索引 关于线程的知识点其实 ...
- 细说C#多线程那些事 - 线程同步和多线程优先级
上个文章分享了一些多线程的一些基础的知识,今天我们继续学习. 一.Task类 上次我们说了线程池,线程池的QueueUserWorkItem()方法发起一次异步的线程执行很简单 但是该方法最大的问题是 ...
- java核心知识点学习----多线程并发之线程同步
1.什么是线程同步? 多线程编程是很有趣的事情,它很容易出现"错误情况",这种情况不是由编码造成的,它是由系统的线程调度造成的,当使用多个线程来访问同一个数据时,很容易出现&quo ...
- 【转】多线程:C#线程同步lock,Monitor,Mutex,同步事件和等待句柄(上)
本篇从Monitor,Mutex,ManualResetEvent,AutoResetEvent,WaitHandler的类关系图开始,希望通过 本篇的介绍能对常见的线程同步方法有一个整体的认识,而对 ...
- C# Monitor与线程同步
Monitor对象(C#知识点总结系列:4.C#中Monitor和Lock以及区别) 1.Monitor.Enter(object)方法是获取锁,Monitor.Exit(object)方法是释放锁, ...
- Win32多线程编程(3) — 线程同步与通信
一.线程间数据通信 系统从进程的地址空间中分配内存给线程栈使用.新线程与创建它的线程在相同的进程上下文中运行.因此,新线程可以访问进程内核对象的所有句柄.进程中的所有内存以及同一个进程中其他所有线 ...
- C# 多线程编程第二步——线程同步与线程安全
上一篇博客学习了如何简单的使用多线程.其实普通的多线程确实很简单,但是一个安全的高效的多线程却不那么简单.所以很多时候不正确的使用多线程反倒会影响程序的性能. 下面先看一个例子 : class Pro ...
- java多线程二之线程同步的三种方法
java多线程的难点是在:处理多个线程同步与并发运行时线程间的通信问题.java在处理线程同步时,常用方法有: 1.synchronized关键字. 2.Lock显示加锁. 3.信号量Se ...
随机推荐
- Java基础00-修饰符18
1. 包 1.1 包的概述和使用 通过记事本的方法 package com.itheima;public class HelloWorld { public static void main(Stri ...
- CocoaPods 私有化
一.创建所需要的代码仓库 创建 Spec 私有索引库(ZFSpec),用来存放本地spec 创建模块私有库(ZFPodProject),用来存放项目工程文件 二.私有索引库添加到本地 CocoaPod ...
- SpringBoot总结之事务和AOP
一.事务 在Spring Boot中,当我们使用了spring-boot-starter-jdbc或spring-boot-starter-data-jpa依赖的时候,框架会自动默认分别注入DataS ...
- 基于 Blazor 打造一款实时字幕
早先在录制视频的时候一直使用的是 obs-auto-subtitle 作为实时字幕展示功能.不过这个是以 OBS 插件的形式存在,不管是语言和功能上都有一定的限制.故而使用 Blazor server ...
- 导出数据在exlcel上
1.前台写一个按钮跳到控制层 <a href="account.do?flag=out" >导出表格</a> 2.控制层导出数据方法 @RequestMap ...
- 2021年BI软件排名,国内外BI软件功能对比
数据分析是帮助企业深入了解自身业务表现(例如正在做什么或哪块业务需要注意和改进)的重要元素.为了获得更直观的展现,数据分析BI软件可帮助公司通过报告.数据可视化.应用程序等从数据中获取决策数据支撑.没 ...
- H5页面怎么跳转到公众号主页?看过来
前言: 做公众号开发的小伙伴,可能会遇到这种需求: 在一个H5页面点击一个关注公众号按钮跳转到公众号主页. 听到这个需求的一瞬间,疑惑了!这不可能! 摸了摸高亮的额头!没办法,做还是要做的 开始上解决 ...
- memcache(11211)未授权访问
1.安装Memcache服务端 sudo apt-get install memcached 2.启动服务 sudo memcached -d -m 128 -p 11211 -u root 3.ap ...
- JavaScript-编译与闭包
编译原理 尽管 JavaScript 经常被归类为"动态"或"解释执行"的语言,但实际上它是一门编译语言.JavaScript 引擎进行的编译步骤和传统编译语言 ...
- WinForm PerformClick()
在Winfrom开发中,经常遇到调用Click事件,如:btn_click(null,null),其实winfrom也自带一个模拟点击事件:PerformClick(),区别就是:前者无论控件是否En ...