C#中Monitor对象和Lock关键字的区别

  Monitor对象

  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()
        {
            //做具体的事情
        }
    }

以上是小编为您精心准备的的内容,在的博客、问答、公众号、人物、课程等栏目也有的相关内容,欢迎继续使用右上角搜索按钮进行搜索对象
, 线程
, object
, 代码
, lock
, monitor
, Object对象
C#常用公共方法
c站、c语言、cf、ch、c罗,以便于您获取更多的相关知识。

时间: 2024-10-14 17:43:23

C#中Monitor对象和Lock关键字的区别的相关文章

ThinkPHP中实例化对象M()和D()的区别,select和find的区别

原文:ThinkPHP中实例化对象M()和D()的区别,select和find的区别 1.ThinkPHP中实例化对象M()和D()的区别 在实例化的过程中,经常使用D方法和M方法,这两个方法的区别在于M方法实例化模型无需用户为每个数据表定义模型类,如果D方法没有找到定义的模型类,则会自动调用M方法.通俗一点说:M实例化参数是数据库的表名.D实例化的是你自己在Model文件夹下面建立的模型文件 例如:$user = new UserModel(); 等价于$user = D('user'); 如

C#中实现线程同步lock关键字的用法详解_C#教程

1. lock关键字保证一个代码块在执行的过程中不会受到其他线程的干扰,这是通过在该代码块的运行过程中对特定的对象加互斥锁来实现的. 2. lock关键字的参数必须是引用类型的对象.lock对基本数据类型如int,long等无效,因为它所作用的类型必须是对象.如果传入long类型数据,势必被转换为Int64结构类型,则加锁的是全新的对象引用.如果需要对它们进行互斥访问限制,可以使用System.Threading.Interlocked类提供的方法,这个类是提供原子操作的. 3. lock(th

C#中使用Monitor类、Lock和Mutex类来同步多线程的执行

转自 http://blog.csdn.net/tjvictor/archive/2007/01/20/1488290.aspx 在多线程中,为了使数据保持一致性必须要对数据或是访问数据的函数加锁,在数据库 中这是很常见的,但是在程序中由于大部分都是单线程的程序,所以没有加锁的必要,但是在多线程中,为了保持数据的同步,一定要加锁,好在 Framework中已经为我们提供了三个加锁的机制,分别是Monitor类.Lock关键字和Mutex类.         其中Lock关键词用法比较简单,Mon

C#中Monitor和Lock简介及区别

1.Monitor.Enter(object)方法是获取锁,Monitor.Exit(object)方法是释放锁,这就是Monitor最常用的 两个方法,当然在使用过程中为了避免获取锁之后因为异常,致锁无法释放,所以需要在try{} catch(){}之 后的finally{}结构体中释放锁(Monitor.Exit()). 2.Monitor的常用属性和方法: Enter (Object) 在指定对象上获取排他锁. Exit(Object) 释放指定对象上的排他锁. IsEntered 确 定

一起谈.NET技术,C#中的lock关键字

前几天与同事激烈讨论了一下,有一点收获,记录起来. 首先给出MSDN的定义: lock 关键字可以用来确保代码块完成运行,而不会被其他线程中断.这是通过在代码块运行期间为给定对象获取互斥锁来实现的. 先来看看执行过程,代码示例如下: 假设线程A先执行,线程B稍微慢一点.线程A执行到lock语句,判断obj是否已申请了互斥锁,判断依据是逐个与已存在的锁进行object.ReferenceEquals比较(此处未加证实),如果不存在,则申请一个新的互斥锁,这时线程A进入lock里面了. 这时假设线程

《C#多线程编程实战(原书第2版)》——1.10 使用C#中的lock关键字

1.10 使用C#中的lock关键字 本节将描述如何确保当一个线程使用某些资源时,同时其他线程无法使用该资源.我们将了解该情况的必要性及整个线程安全概念都包含什么. 1.10.1 准备工作 为了学习本节,你需要安装Visual Studio 2015.除此之外无需其他准备.本节的源代码放置在BookSamplesChapter1Recipe9目录中. 1.10.2 实现方式 请执行以下步骤来了解如何使用C#中的lock关键字: 1.启动Visual Studio 2015.新建一个C#控制台应用

Lock关键字的用法

本文转载:http://www.189works.com/article-8218-1.html  Lock 关键字可确保当一个线程位于代码的临界区时,另一个线程不会进入该临界区.如果其他线程尝试进入锁定的代码,则它将一直等待(即被阻止),直到该对象被释放.  Lock关键字用途主要是解决多线程下限制同时访问同一个对象.   摘要: 一直以来对于lock关键字的用法都存有疑惑,也从网上看到很多关于他的资料包括MSDN,无奈MSDN讲述的真是让人上火.今天决定小小研究一下一直都知道lock是锁定某

开始了解 PHP V5 中的对象

对象     本文描述 PHP V5 中对象和类的基础知识,从最基本的概念一直讲到继承,主要针对经验丰富的面向对象程序员和尚未接触过对象的读者. 作为 PHP 程序员,您肯定知道变量和函数.但类和对象可能就是另一回事.不定义单个类,就可以创建完美的系统.但即使您决定在自己的代码中不使用面向对象的编程,您仍可能需要了解面向对象的编程.例如,如果使用第三方库,比如通过 PHP Extension and Application Repository (PEAR) 可以使用的库,您将发现自己在实例化对

.NET 中的对象序列化

对象 简介序列化是指将对象实例的状态存储到存储媒体的过程.在此过程中,先将对象的公共字段和私有字段以及类的名称(包括类所在的程序集)转换为字节流,然后再把字节流写入数据流.在随后对对象进行反序列化时,将创建出与原对象完全相同的副本. 在面向对象的环境中实现序列化机制时,必须在易用性和灵活性之间进行一些权衡.只要您对此过程有足够的控制能力,就可以使该过程在很大程度上自动进行.例如,简单的二进制序列化不能满足需要,或者,由于特定原因需要确定类中那些字段需要序列化.以下各部分将探讨 .NET 框架提供