C#知识点总结系列:四、C#中Monitor和Lock以及区别

  Monitor对象this

  1.Monitor.Enter(object)方法是获取锁,Monitor.Exit(object)方法是释放锁,这就是Monitor最经常使用的两个方法,固然在使用过程当中为了不获取锁以后由于异常,致锁没法释放,因此须要在try{} catch(){}以后的finally{}结构体中释放锁(Monitor.Exit())。spa

  2.Monitor的经常使用属性和方法:线程

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

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

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

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

    PulseAll 通知全部的等待线程对象状态的更改。进程

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

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

    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()
        { 
            //作具体的事情
        }
    }
相关文章
相关标签/搜索