线程同步之Monitor

C# 浅谈线程同步Lock、Monitor、Interlocked、Mutex等多种线程锁及测试汇总 文章目录一、前言二、线程锁的类型1. volatile关键字2. Lock锁3. System.Threading.Interlocked4. Monitor5. Metux6. ReaderWriterLock三、实例代码测试1. Lock锁Lock的测试总结: 一、前言   在讲述线程锁之前,我们先了解一下什么是线程同步?   线程同步----在多线程程序中,会出现多个线程抢占一个资源的... 阅读详情
1、Monitor.Enter(obj);申请对obj(非静态字段)的独立访问权;
2、对静态字段加锁时,使用Monitor.Enter(typeof(共享类名));
示例:
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading;
 
namespace Thread_Monitor
{
    class ShearedResource               //多线程共享的资源
    {
        public int instanceCount = 0;          //!实例字段
        public static int counter = 0;         //!静态字段
    }
 
    class Program
    {
        private static void IncreaseCount(Object obj)
        {
            Monitor.Enter(obj);
            int beginNum = (obj as ShearedResource).instanceCount;
            for (int i = 0; i < 100000; i++)
                beginNum++;
            (obj as ShearedResource).instanceCount = beginNum;
            Console.WriteLine("Thread ID:{0},  Count: {1}", Thread.CurrentThread.ManagedThreadId, beginNum);
            Monitor.Exit(obj);            
        }
                
        private static void IncreaseStaticCount()
        {
            Monitor.Enter(typeof(ShearedResource));
            int beginNum = ShearedResource.counter;
            for (int i = 0; i < 100000; i++)
                beginNum++;            
            ShearedResource.counter = beginNum;
            Console.WriteLine("Thread ID:{0},  Count: {1}", Thread.CurrentThread.ManagedThreadId, beginNum);
            Monitor.Exit(typeof(ShearedResource));
        }

        static void Main(string[] args)
        {
            const int threadCount = 15;
            ShearedResource sr = new ShearedResource();
            Thread[] threads = new Thread[threadCount];
            for (int i = 0; i < threadCount; i++)
            {
                threads[i] = new Thread(new ParameterizedThreadStart(IncreaseCount)).Start(sr);      //!线程带参
                //threads[i] = new Thread(IncreaseStaticCount).Start();
            }
            Console.ReadKey();
        }
    }
}

访问静态字段
        private static void IncreaseCount(Object obj)
        {
            Monitor.Enter(typeof(ShearedResource));
            int beginNum = ShearedResource.counter;
            for (int i = 0; i < 100000; i++)
                beginNum++;
            ShearedResource.counter = beginNum;
            Console.WriteLine("Thread ID:{0},  Count: {1}", Thread.CurrentThread.ManagedThreadId, beginNum);
            Monitor.Exit(typeof(ShearedResource));
        }
3、使用Monitor控制线程的推进顺序
(1)B执行Monitor.Wait(obj)后阻塞,等待A执行Monitor.Pulse(obj)。一旦A执行Monitor.Pulse(obj),将通知B让其继续走下去。
(2)必须确保线程B先执行,否则会产出死锁,线程B将永远等不到A的消息。
(3)每调用一次Monito.Pulse()方法,等待队列里的一个线程被激活;调用Monitor.PulseAll()方法,激活等待队列里的所有线程。
//线程A的执行代码
lock(obj)
{
    //访问共享资源obj...
    Monitor.Pulse(obj);
}
//线程B的执行代码
lock(obj)
{
    Monitor.Wait(obj);    
    //访问共享资源obj...
}


4、用Attribute实现
        [MethodImpl(MethodImplOptions.Synchronized)]
        private static void IncreaseCount(Object obj)
        {
            //访问共享资源...
        }


好处,不需要改内部代码。
需引入命名空间:using System.Runtime.CompilerServices;
此方法是锁定类中一个方法,不是锁定整个类
5、指定超时选项以避免死锁
基本用法:
bool lockTaken = false;
Monitor.TryEnter(lockObj, 3000, ref lockTaken);    //超时3秒,   lockTaken为引用类型
if(lockTaken)
{
    try
    {    //访问共享资源....    }
    finally
    {
        Monitor.Exit(lockObj);
    }
}

C#多线程同步利器:Monitor全解析 摘要: C#的Monitor是多线程同步的核心工具,通过Enter/Exit实现互斥锁,确保共享资源安全访问,避免数据错乱。其高级功能Wait/Pulse可实现线程协作,典型应用如生产者-消费者模型,通过条件等待和唤醒机制提升效率。关键用法包括: 基础锁:Monitor.Enter+Exit(推荐用lock语法糖); 灵活尝试:TryEnter支持超时控制,避免阻塞; 线程协作:Wait释放锁并等待,Pulse唤醒等待线程,需配合while循环防虚假唤醒。 适用于共享资源操作和复杂线程协调场景,是构建稳健多 阅读详情

相关推荐

C#线程同步-Monitor

class Program { readonly static object _Sync = new object(); const int _Total = 10; static long _Count = 0; static void Main(string[] args) { Task task = Task.Run(() => Decrement()); .

zxcvb036的博客 190

再说多线程(二)——细说Monitor类

1. Monitor.Wait 方法有两个比较常用的方法重载:Object:等待的锁的对象功能:释放当前线程所占用的对象锁,并且阻塞当前的线程直到它再次拥有这个锁。- Object:等待的锁的对象- Int32:线程再次进入就绪队列的等待时长,单位毫秒功能:释放当前线程所占用的对象锁,并且阻塞当前的线程直到它再次拥有这个锁。如果指定的时长过去,线程将由等待队列转移到就绪队列。2. Monitor.Wait 方法的主要执行步骤阻塞当前的线程将这个线程移动到等待队列中释放当前的同步锁。

q__y__L的博客 1445

线程同步Synchronized,监视器monitor和锁lock的关系3---马克-to-win java视频

线程同步Synchronized,监视器monitor和锁lock的关系2---马克-to-win java视频

多线程Monitor工作原理

我们都知道synchronized的作用是用来保证修饰的代码或者方法执行有且只有一个线程执行,也就是锁。那么在执行被锁住的方式时,synchronized就需要通过monitor来记录和保证锁的状态。所以monitor这里的作用其实就是起到了控制synchronized什么时候获取锁,什么时候释放锁,以及记录了锁被重用的次数。🍎。

私欲日生,如地上尘,一日不扫,便又有一层。着实用功,便见道无终穷,愈探愈深,必使精白无一毫不彻方可。 1657

从零到一:鲲鹏920服务器上的DeepSeek模型部署全流程解析

本文详细解析了在华为鲲鹏920服务器上部署DeepSeek模型的全流程,包括环境准备、模型服务框架部署、性能优化及生产环境方案。通过ARM架构优化和量化技术,显著提升模型推理效率,适用于企业级AI应用场景,助力国产化技术落地。

weixin_29094775的博客 599

在linux上本地大模型部署与推理

您的Python脚本(客户端)可能在您的个人电脑上,而模型服务(服务器)在远程Linux服务器上。如果您的服务器有强大的NVIDIA GPU,并且您对性能有更高的要求(例如需要高吞吐量),vLLM是更好的选择。这种方式无需向公网暴露服务器端口,而是通过加密的SSH通道将服务器的端口“映射”到您的本地电脑上。我们将启动一个API服务器,它会加载您指定的模型,并等待您的代码前来调用。如果您直接在SSH窗口运行上面的命令,一旦您关闭窗口,服务就会停止。这是根据您的原始代码修改的版本,适配本地vLLM服务。

frostmelody 全网同名,大家多多关注呀~ 持续分享优质内容! 2053

monitor线程

多线程中诸多技术点还是不大明白,今天研究了一下Monitor类。Monitor类是多线程中用以实现同步的一种技术,主要是同一进程内多线程间的同步技术。Monitor类中有以下几个方法需要注意:Monitor.Enter(object obj)方法,其意义相当于Lock(obj);Monitor.Exit(object obj)方法,意思是释放被锁的对象Monitor.Wait(object

ximengtiankong的专栏 1654

YOLOv11多模态融合实战:基于YOLOFuse的RGB与红外线(IR)协同检测技术解析

本文深入解析了基于YOLOv11的YOLOFuse多模态融合技术,重点探讨了RGB与红外线(IR)协同检测的实现原理与实战应用。文章详细介绍了双流架构与数据级、特征级、决策级三种融合策略,并通过实战案例展示了其在低光照、复杂环境下显著提升检测精度与鲁棒性的优势,为全天候安防、自动驾驶等场景提供了有效的技术解决方案。

weixin_29041195的博客 649

java多线程深入_深入理解Java多线程

本文主要就Hollis深入理解Java多线程系列文章的总结。原文详见[HollisChuang's Blog,欢迎大家关注!Synchronized实现原理public class SynchronizedTest {public synchronized void doSth(){System.out.println("Hello World");}public void doSth1(){sy...

weixin_36275231的博客 313

皮肤病识别 - 使用DenseNet或EfficientNet模型在ISIC数据集上进行皮肤病识别任务

在本篇博客中,我们探讨了如何使用 DenseNet 和 EfficientNet 模型在 ISIC 数据集上进行皮肤病识别任务。我们加载了数据集,并进行了预处理。然后我们使用 Keras 构建了两个不同的模型,并训练和评估了它们。最后,我们使用训练好的模型对新的皮肤病图像进行了预测。

斌擎科技 1303

英飞凌TC3xx--深度手撕HSM安全启动(三)--TC3xx HSM系统架构

TC3xx的HSM内核是一颗32位的ARM Cortex M3,主频可达100MHz,支持对称算法AES128、非对称算法PKC(Public Key Crypto) ECC256、Hash SHA2,以及TRNG(真随机数生成)。

认真搞搞汽车MCU 5741

synchronized 的 monitor 机制

monitor 是 synchronized 中用以实现线程之间的互斥与协作的主要手段。每个 monitor 在每个时刻,只能被一个线程持有,该线程就是 activeThread,其它线程都是 waitingThread,分别在两个队列 entrySet 和 waitSet 里等候。在 entrySet 中等待的线程状态是 waiting for monitor entry,而在 wait set 中等待的线程状态是 in Object.wait()。

JellyfishMIX 的博客 1427

【WRF-Urban】WUDAPT详解:An Urban Weather, Climate, and Environmental Modeling Infrastructure

WUDAPT详解:An Urban Weather, Climate, and Environmental Modeling Infrastructure

WW、forever的博客 496

多线程同步之——monitor

线程的同步有多种方法,这里简单学习一下使用monitor这个对象同步线程。 我们知道如果程序中有些操作比较耗时,那么就可以指派专门的线程来处理这件事,有时候,启动的多个线程需要同时执行一个方法、修改同一个变量等,那么这时候如何做好线程同步,就很关键。 程序实现的效果是: 两个线程删除同一个数组中的数据,删除完成后自动关闭线程。使用monitor对象实现。 程序实现的主要思路: 1、定义一

李黎敏 ——为优秀j2ee架构师而努力 1110

如何在非序列模式下使用类似图像模功能

如何在非序列模式下使用类似图像模功能

weixin_72050316的博客 552

第十六章:载板制造工艺大全

本文详细介绍了IC载板制造的完整工艺流程,主要包括开料、钻孔、孔金属化、图形形成、层压、表面处理、成型和电测8大工序。每个工序都列出了关键参数和质量控制要点,如开料尺寸精度±0.1mm、激光钻孔孔径50-150μm、孔金属化铜厚20-30μm、图形形成线宽15μm±2μm等。文中还特别说明了MSAP工艺和沉金等特殊工艺的详细流程,以及成型精度和电测标准等关键指标。全文通过流程图和参数表格直观展示了IC载板制造的核心工艺和质量要求。

Open 184

Monitor线程同步

最近在园子里看到有关monitor实现线程同步的文章,正好最近的项目中要用到并发控制,所以就抽时间学习了一下monitor,之前都是不怎么写博客的,呵呵感觉花了时间去学习它,还是记下来比较好。。monitor我理解为是一个监视器,用来监视临界区域的信号量。学过操作系统的童鞋都应该知道这个概念哈~因为要通过信号量,所以要定义一个信号量,这里我们通常定义一个object类型的变量,注意这个变量一...

weixin_33733810的博客 121

数学建模模型总结

这是本人在两年内准备参加数学建模竞赛搜集到的模型资料,已经经过了本人的筛选和整理,希望能够对准备参加数学建模竞赛的学弟学妹们提供一些帮助!

Monitor类实现线程同步

Monitor类实现线程同步 一、简介 Lock关键字是Monitor的一种替换用法,lock在IL代码中会被翻译成Monitor. lock (obj) { //代码段 } //就等同于 Monitor.Enter(obj); //代码...

weixin_43163153的博客 91

TMS_WebGMaps_1.9.8.0_Full_Source

TMS_WebGMaps_1.9.8.0_Full_Source 全源码 delphi cbuilder

迈瑞BS系列全自动生化分析仪LIS协议接口手册(内含HL7和ASTM)

迈瑞BS系列全自动生化分析仪LIS协议接口手册,内含HL7和ASTM)

C# 多线程同步方法 之 Monitor.Wait 与 Monitor.Pulse

1、线程同步原理 组成:(以单个object为准) 1、[持锁线程] = locker = 持锁中 2、[就绪队列] = ready queue = 一等队列,队列中的线程将被挂起等待,系统会自动按顺序为线程分配对象的排他锁 3、[等待队列] = wait queue = 二等队列,队列中的线程将被挂起等待,需要通过Pulse来控制向前 2、Monitor 类使用说明 3、测试例子 A /* /...

rcr676的博客 1119

线程同步monitor

本文用经典的生产者消费者的例子,说明Mnitor对象的用法。实现的目标是: 生产者生产一个数据,然后消费者开始消费,消费完成后生产者继续生产,循环10次后结束。 下面是代码: namespace ConsoleTest { /// <summary> /// 生产者消费者例子 /// </summary> public class P...

weixin_30271335的博客 138

多线程:C#线程同步lock,Monitor,Mutex,同步事件和等待句柄

<br />转帖地址:<br />http://www.cnblogs.com/freshman0216/archive/2008/07/27/1252253.html<br />http://www.cnblogs.com/freshman0216/archive/2008/07/30/1252345.html<br />http://www.cnblogs.com/freshman0216/archive/2008/08/07/1256919.html<br /> <br />本篇从Monitor,Mu

ct的专栏 1756

同步线程2(Monitor)

1.Monitor类同样位于System.Threading命名空间,提供资源存取的控制机制,允许一个特定的线程对资源作独占的存取,与lock不同的是,Monitor类让你决定何时阻隔或者继续特定线程的执行操作,这些方法让你能够更为精确地控制资源的存取。 2.Monitor类提供一级静态方法,用以进行资源的控制,其中首先介绍的为Pulse以及Wait这两个方法,Wait方法让你能够锁定目前的

mzbxzhdxmyb的专栏 464

多线程同步,Monitor类

多线程同步问题

weixin_46078387的博客 511

vb.net 教程 6-17 使用Monitor类实现线程的同步

版权声明:本文为博主原创文章,转载请在显著位置标明本文出处以及作者网名,未经作者允许不得用于商业目的。 如上一节《vb.net 教程 6-16 使用SyncLock语句实现线程的同步 》介绍的SyncLock语句,是一种简单处理同步的方法。 .net还提供了Monitor类处理线程同步。Monitor类比较重要的几个静态方法: Enter 在指定对象上获取排他锁。 Exit 释放指定对象上的...

学习微软 .net 技术开发 1246
上一篇: C#线程模拟生产者消费者
下一篇: 线程同步之等待句柄
NoNeil
博客等级 码龄15年 108粉丝 50原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值