zoukankan      html  css  js  c++  java
  • 转: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()
            { 
                //做具体的事情
            }
        }

     原文:http://www.cnblogs.com/cuihongyu3503319/p/5730268.html

  • 相关阅读:
    HDU 5313 bitset优化背包
    bzoj 2595 斯坦纳树
    COJ 1287 求匹配串在模式串中出现的次数
    HDU 5381 The sum of gcd
    POJ 1739
    HDU 3377 插头dp
    HDU 1693 二进制表示的简单插头dp
    HDU 5353
    URAL 1519 基础插头DP
    UVA 10294 等价类计数
  • 原文地址:https://www.cnblogs.com/shy1766IT/p/6391158.html
Copyright © 2011-2022 走看看