C#中Monitor和Lock的用法区别

el/2024/6/13 12:25:58

1.Monitor.Enter(object)方法是获取锁,Monitor.Exit(object)方法是释放锁,这就是Monitor最常用的两个方法,当然在使用过程中为了避免获取锁之后因为异常,致锁无法释放,所以需要在try{} catch(){}之后的finally{}结构体中释放锁(Monitor.Exit())。

  2.Monitor的常用属性和方法:

    Enter(Object) 在指定对象上获取排他锁。

    Exit(Object) 释放指定对象上的排他锁。

    IsEntered 确定当前线程是否保留指定对象锁。

    Pulse 通知等待队列中的线程锁定对象状态的更改。

    PulseAll 通知所有的等待线程对象状态的更改。

    TryEnter(Object) 试图获取指定对象的排他锁。

    TryEnter(Object, Boolean) 尝试获取指定对象上的排他锁,并自动设置一个值,指示是否得到了该锁。

    Wait(Object) 释放对象上的锁并阻止当前线程,直到它重新获取该锁。

                                       Lock关键字

  1.Lock关键字实际上是一个语法糖,它将Monitor对象进行封装,给object加上一个互斥锁,A进程进入此代码段时,会给object对象加上互斥锁,此时其他B进程进入此代码段时检查object对象是否有锁?如果有锁则继续等待A进程运行完该代码段并且解锁object对象之后,B进程才能够获取object对象为其加上锁,访问代码段。

  2.Lock关键字封装的Monitor对象结构如下:

复制代码

复制代码

            try{Monitor.Enter(obj);dosomething();}catch(Exception ex){}finally{Monitor.Exit(obj);}

复制代码

复制代码

  3.锁定的对象应该声明为private static object obj = new object();尽量别用公共变量和字符串、this、值类型。

Monitor和Lock的区别

  1.Lock是Monitor的语法糖。

  2.Lock只能针对引用类型加锁。

  3.Monitor能够对值类型进行加锁,实质上是Monitor.Enter(object)时对值类型装箱。

  4.Monitor还有其他的一些功能。

本文代码示例:

复制代码

复制代码

    class Program{private static object obj = new object();public void LockSomething(){lock (obj){dosomething();}}public void MonitorSomeThing(){try{Monitor.Enter(obj);dosomething();}catch(Exception ex){}finally{Monitor.Exit(obj);}}public void dosomething(){ //做具体的事情}}

复制代码

复制代码


http://www.ngui.cc/el/5545772.html

相关文章

C#操作Access数据库 增删改查

本文以ADOX操作Access 1、在C#中新建AccessClass.cs文件,内容如下 1 using System;2 using System.Collections.Generic;3 using System.Linq;4 using System.Text;5 using System.Collections;6 using System.IO; //包含File7 using System.Data; //包含data…

C#数组按值和按引用传递数组区别

C#中,存储数组之类对象的变量并不是实际存储对象本身,而是存储对象的引用。按值传递数组时,程序将变量传递给方法时,被调用方法接受变量的一个副本,因此在被调用时试图修改数据变量的值时,并不会影响变量的…

窗口句柄、窗口类对象的关系

HWND hwnd;//窗口句柄 CWnd wnd;//窗口类对象 窗口类对象中有一个成员是窗口句柄。 窗口句柄,提供了窗口的一个标识,类似于指针的概念,每一个窗口都对应了一个窗口句柄作为其标识,通过句柄可以方便的从内…

OpenCV 图像清晰度评价算法(相机自动对焦)

相机的自动对焦要求相机根据拍摄环境和场景的变化,通过相机内部的微型驱动马达,自动调节相机镜头和CCD之间的距离,保证像平面正好投影到CCD的成像表面上。这时候物体的成像比较清晰,图像细节信息丰富。 相机自动对焦的过程&#…

一种新的图像清晰度评价函数

自动聚焦是机器人视觉、数字视频系统中的关键技术之--,是决定图像质量的重要因素,是获取清晰图 像的第1步。聚焦性能取决于调焦评价函数的准确性和有效性,即评价函数必须具有无偏性好、单峰性强和 较好的抗噪性能。图像模糊的本质是高频分量的损失,聚焦图像比离焦图像包含更多的…

委托事件的线程问题

事件注册方法或委托后,事件所在的线程执行注册的方法或委托,所以如果方法中有跨线程控件就需要使用invoke等处理。

图像灰度图,直方图,像素通道问题

1.图像直方图概述   直方图广泛运用于很多计算机视觉运用当中,通过标记帧与帧之间显著的边缘和颜色的统计变化,来检测视频中场景的变化。在每个兴趣点设置一个有相近特征的直方图所构成 “标签”,用以确定图像中的兴趣点。边缘、色彩、角度…

信号傅里叶变换后的实数和虚数部分理解

傅里叶(FFT、DFT、傅立叶、Fourier)傅里叶变换的结果为什么含有复数? 为什么傅里叶变换的结果含有复数成份? 看了很多关于FFT的资料,现在看到一个资料说FFT转换的结果是实部虚部,所以不理解为什么从时域转…

C++ 简单实现HTTP GET/POST 请求

HTTP(超文本传输协议)是一种客户端与服务端的传输协议,最早用于浏览器和服务器之间的通信,后来因为其使用灵活、方便等特点,广泛用于客户端与服务端的通信。文章将简单介绍HTTP协议,同时以C方式分别实现HTTP GET、POST 请求 HTTP …

C#无损高质量压缩图片实现代码

最近,项目上涉及到了图像压缩,发现原有的图像压缩功能,虽然保证了图像的大小300K以内,但是压缩后的图像看的不在清晰,并且,限定了图片的Height或者是Width。 在CSDN上看到了一个压缩算法:C#无损…