锁、C#中Monitor和Lock以及界别

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重大字实在是1个语法糖,它将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 锁定目的(即引用类型)而不是值类型。)。

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

Monitor 类通过向单个线程授予对象锁来决定对目的的访问。对象锁提供限制访问代码块(经常号称临界区)的力量。当贰个线程拥有对象的锁时,其他任何线程都不或者博得该锁。还足以接纳 Monitor 来确保不会允许任何任何线程访问正在由锁的全部者执行的应用程序代码节,除非另三个线程正在采纳其余的锁定目标举办该代码。

Monitor 具有以下功效:

  • 它依照需求与某些对象相关联。

  • 它是未绑定的,相当于说可以直接从其他上下文调用它。

  • 不可以成立 Monitor 类的实例。

将为各样一块对象来保障以下音信:

  • 对近期有着锁的线程的引用。

  • 对就绪队列的引用,它包涵准备获取锁的线程。

  • 对等候队列的引用,它包涵正在等待锁定目标情形变化通知的线程。

  • 下表描述了拜访同步对象的线程可以动用的操作:

     

    操作

    说明

    EnterTryEnter

    获取对象锁。此操作同样会标记临界区的开头。其他任何线程都不能进入临界区,除非它使用其他锁定对象执行临界区中的指令。

    Wait

    释放对象上的锁以便允许其他线程锁定和访问该对象。在其他线程访问对象时,调用线程将等待。脉冲信号用于通知等待线程有关对象状态的更改。

    Pulse (信号), PulseAll

    向一个或多个等待线程发送信号。该信号通知等待线程锁定对象的状态已更改,并且锁的所有者准备释放该锁。等待线程被放置在对象的就绪队列中以便它可以最后接收对象锁。一旦线程拥有了锁,它就可以检查对象的新状态以查看是否达到所需状态。

    Exit

    释放对象上的锁。此操作还标记受锁定对象保护的临界区的结尾。

    使用 Enter 和 Exit 方法标记临界区的初步和尾声。倘诺临界区是2个连接指令集,则由 Enter 方法得到的锁将保障唯有1个线程能够行使锁定目的举行所涵盖的代码。在那种气象下,建议您将这个指令放在 try 块中,并将 Exit 指令放在 finally 块中。此意义日常用于共同对类的静态或实例方法的造访。若是实例方法必要一起线程访问,则它将使用当前实例作为要锁定的靶子调用 Enter 和对应的 Exit 方法。由于只能够有三个线程持有当前实例上的锁,因此该方法一次只可以由一个线程来推行。静态方法是使用当前实例的 Type.aspx) 作为锁定目的以接近的方法来保安的。Enter 和 Exit 方法提供的效应与
    C# lock 语句(在 Visual Basic
    中为 SyncLock)提供的法力雷同,分裂在于 lockC#, 和 SyncLock 以 tryfinally 块(在
    Visual Basic
    中为 TryFinally)来包装 Exit 方法,以保险释放监视器。

    如果临界区超越整个艺术,则足以因此将 System.Runtime.CompilerServices.MethodImplAttribute.aspx) 放置在艺术上并在 MethodImplAttribute 的构造函数中指定 Synchronized.aspx) 值来落实上述锁定效率。使用该属性后就不必要 Enter 和 Exit 语句了。请留心,该属性将使当前线程持有锁,直到方法再次回到;如若能够更早释放锁,则使用 Monitor 类或
    C#lock 语句而不是该属性。

    即使锁定和刑释解教给定对象的 Enter 和 Exit 语句可以超越成员或类的界限或同时超越两者的疆界,但并不引进那样做。

    当拔取要联手的对象时,应只锁定私有或内部对象。锁定外部对象恐怕造成死锁,那是因为不相干的代码大概会由于分裂的目标而挑选锁定相同的目的。

  • 以上来自MSDN、

  • @陈卧龙的博客

相关文章