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 ...
随机推荐
- 详解Window10下使用IDEA搭建Hadoop开发环境
前言 经过三次重装,查阅无数资料后成功完成hadoop在win10上实现伪分布式集群,以及IDEA开发环境的搭建.一步一步跟着本文操作可以避免无数天坑. 下载安装Hadoop 下载安装包 进入官网下载 ...
- 12、Java——异常
1.异常处理方案: 异常抛出 : throws 把异常抛出到上一层,谁调用谁解决 异常捕获 : try..catch try{ 有可能出现异常的代码; }catch(FileNotFoundEx ...
- 三分钟入门 InnoDB 存储引擎中的表锁和行锁
各位对 "锁" 这个概念应该都不是很陌生吧,Java 语言中就提供了两种锁:内置的 synchronized 锁和 Lock 接口,使用锁的目的就是管理对共享资源的并发访问,保证数 ...
- CF896D Nephren Runs a Cinema
CF896D Nephren Runs a Cinema 题意 售票员最开始没有纸币,每次来一个顾客可以给她一张.拿走她一张或不操作.求出不出现中途没钱给的情况 \(n\) 名顾客后剩余钱数在 \(l ...
- 01_什么是BS结构,什么是CS结构?
C/S和B/S都是互联网中常见的网络结构模型. 一.什么是C/S模型? C是英文单词"Client"的首字母,即客户端的意思,C/S就是"Client/Server&qu ...
- idea创建web工程、配置tomcat及基本配置
背景 现在许多人从eclipse转到idea了,小编也不例外.但是刚转初期还是有挺多不适应的,特总结了创建maven的web工程.配置tomcat服务器及基本配置.有了这些配置,上手idea也就跟ec ...
- QT从入门到入土(四)——多线程(QtConcurrent::run())
引言 在前面对Qt多线程(QThread)做了详细的分析:QT从入门到入土(四)--多线程(QThread) - 唯有自己强大 - 博客园 (cnblogs.com) 但是最近在做项目时候,要将一个函 ...
- 使用ffmpeg给视频添加跑马灯效果(滚动字幕)
直接上命令 从左往右滚 ffmpeg -i input.mp4 -vf "drawtext=text=string1 string2 string3 string4 string5 stri ...
- 攻防世界misc——János-the-Ripper
攻防世界misc---János-the-Ripper 附件题目,题目的文件名为:misc100. 下载后,拖入linux中,binwalk发现有隐藏文件.用"strings János- ...
- Java流程控制04——Switch选择结构
switch 多选择结构 switch case 语句判断一个变量与一系列值中某个值是否相等,每个支撑位一个分支. switch语句中的变量类型可以是: byte short int 或者 char ...