请问在多线程中lock与monitor的区别是什么,在什么情况使用lock,什么情况下使用monitor?

解决方案 »

  1.   

    lock: 锁定变量、互斥
    Monitor:是lock的应用,用在对象的lock
      

  2.   

    http://msdn.microsoft.com/zh-cn/library/system.threading.monitor(VS.80).aspxhttp://msdn.microsoft.com/zh-cn/library/c5kehkcz.aspx
      

  3.   

    lock(a)
    {}锁定代码,注意a的区别,如果是static的对所有的线程起作用,如果是class A里定义的public object a,对A的所有对象线程起作用;
    如果是lock(new object){}只对访问相同A的对象的线呈起作用。可以把a看作锁,a的作用范围就是lock线呈的范围monitor是锁定对象
    monitor(A)
    {}也就是在这段程序内锁定A
      

  4.   

    lock(a) = Monitor.Enter (a);
    使用Monitor要注意Enter和Exit要配对.
    否则极易造成线程间的死锁.特别是在有try...catch之类的代码段中使用
    常会在某些情况下Enter后没有Exit.在C#中使用lock就没有这种问题,a在
    花括号结束后就被自动调用了Exit.
      

  5.   

    锁住当前实例:lock(this)
    锁住此类的所有实例:lock(typeof([Type]))
    对字符串的锁,会锁定所有相同内容的字符串,建议可以用静态字符串代替
    lock关键字比Monitor简洁,其实lock就是对Monitor的Enter和Exit的一个封装
    Monitor类通过向单个线程授予对象锁来控制对对象的访问。对象锁提供限制访问临界区的能力。当一个线程拥有对象的锁时,其他任何线程都不能获取该锁。还可以使用 Monitor 来确保不会允许其他任何线程访问正在由锁的所有者执行的应用程序代码节,除非另一个线程正在使用其他的锁定对象执行该代码。
      

  6.   

    翻翻 MSDN 就知道它两是同一样东西
      

  7.   

    lock总是一个语句块吧!那么一个语句块不能写明的代码,例如在一个对象初始化时锁定了对象,在它dispose的时候释放,就肯定不能使用lock。自然,既然monitor是比lock功能更加离散,也就功能更多一点。
      

  8.   

    lock 锁定的是代码块。在某一时刻只允许一个线程访问这段代码。