• C#中Monitor对象与Lock关键字的区别分析


    这篇文章主要介绍了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()
            {
                //做具体的事情
            }
        }
    转载:https://www.cnblogs.com/cuihongyu3503319/p/5730268.html
     
     
     
     
     
     
     
     
     
     
     
     
     
     
     
     
     
     
     
  • 相关阅读:
    return
    debug_backtrace final catch
    Exponential Backoff
    2014 MapReduce
    Extract, Transform, Load
    Factorization of a 768-bit RSA modulus
    奇偶校验 汉明码 如果一条信息中包含更多用于纠错的位,且通过妥善安排这些纠错位使得不同的出错位产生不同的错误结果,那么我们就可以找出出错位了。 crc CRC 循环冗余校验
    An Explanation of the Deflate Algorithm
    通过极限手续定义正数的无理指数方幂
    算术根的存在唯一性
  • 原文地址:https://www.cnblogs.com/BluceLee/p/13846520.html
Copyright © 2020-2023  润新知