Rt
是被锁住的对象?  求详解

解决方案 »

  1.   

    lock(this)就是获取当前类的实例的互斥锁,这个互斥锁在当前类的实例的其他方法中的其他线程中的lock(this)的地方,或者其他线程中其他对象的方法中对该实例进行lock(obj)的时候起作用。
      

  2.   


    我重点想知道的是那个括号里的 "this" 或者其他的一些表达式 如obj之类的  
    到底表示什么东西
      

  3.   

    lock(this)
    锁住自身对象,防止别的线程访问本对象实例。其实这是一个语法糖:
    等于 Monitor.Enter Monitor.Exit
      

  4.   

    我在MSDN上看的 说尽量避免使用lock(this) 这样的 说应该这样object MyLock=new object();
    lock(Mylock)
    {}这样做是为了什么?  和lock(this)可以达到一样的效果吗? 为什么?
      

  5.   

    lock(this)的缺点就是在一个线程通过执行该类的某个使用"lock(this)"的方法锁定某对象之后, 导致整个对象无法被其他线程访问
      

  6.   

    楼上正解,方便用的话可以把属性设置好的控件设置为lock,防止错误操作导致的改变控件的位置和大小
      

  7.   


    你只告诉了我这样是可以的 以及这样是为了什么 但我却想知道为什么lock(this) 与 lock(obj)是等价的
    括号中的表达式到底是什么意思 this与obj明明不是一个对象 为什么却能锁住同样的东西在阐明一下我的问题吧object MyLock=new object();
    lock(Mylock)
    {}
    这样做是为了什么?  和lock(this)可以达到一样的效果吗为什么可以?
      

  8.   


    没有这回事!你可以测试一下,如果对象中一个方法中有代码lock(this),于是这个对象的属性、方法就不能读和修改了?不是的。
      

  9.   


    我比较少用lock(this),一般都是 new一个object,然后锁住。object MyLock=new object();
    lock(Mylock)
    {}这个锁的意思是Mylock这个对象被我锁住了,别的线程再进入这段函数时会首先寻找Mylock,若Mylock被 锁住了,那么别的线程就只有等待,等待我这个线程执行完函数后将Mylock这个对象释放掉,然后其余的线程才能继续访问Mylock这个对象,并锁住他然后继续执行下面的函数。我对lock(this)用得比较少的原因在于我不是很确定lock(This)到底锁住了哪些东西,有点害怕锁得过多。
      

  10.   

    比如说一个人线程中是 lock(obj1),另外一个线程也从同一个对象获得互斥锁,那么它们就是取得了同一把互斥锁,这样第二个程序必须等待第一个程序打开了锁之后自己才能再次给它成功上锁。但是假设另一个线程只是使用了obj1中的一个对象属性,那么这两个线程根本就是使用着两把不同的互斥锁,第二个程序给自己获得锁上锁然后执行,结果两个程序根本没有互斥。所以要注意这个问题。另外更不要以为另外的线程就无法访问obj1了,我见过许多人都有这种误解。lock根本不是这种“对象就不能被其它线程访问了”的意思。lock没有这么宏伟的功能,它就是简单的“取得一把锁然后把它锁上”的概念。程序之间协议使用同一把锁来互斥,但是假设程序使用lock(this),它是想跟外部其它程序来基于自己来互斥吗?许多class内部的程序,它是要让内部的程序之间互斥,但是外部并不知道它基于什么来互斥。这样,为了避免跟外部的程序互锁,所以使用一个private的对象来取得锁。
      

  11.   


    别的线程怎么寻找它?别的线程并不会去自动寻找它!而且只要别的线程的lock不是这个对象,不管别的lock什么对象,都不会MyLock释放,因为它们根本没有通过lcok语句来取得同一把锁。
      

  12.   

    都不会MyLock释放  -->  都不会等待MyLock释放
    我们可以看到许多人以为“只要写个lock,别的线程就不能并发低执行lock内部的语句了”,这完全是错误的。
      

  13.   


    学习。
    顺便补充下,互斥量在x86平台的系统上,是CPU硬件实现的。复制粘贴一小段:  原子操作是不可分割的,在执行完毕不会被任何其它任务或事件中断。在单处理器系统(UniProcessor)中,能够在单条指令中完成的操作都可以认为是" 原子操作",因为中断只能发生于指令之间。这也是某些CPU指令系统中引入了test_and_set、test_and_clear等指令用于临界资源互斥的原因。在对称多处理器(Symmetric Multi-Processor)结构中就不同了,由于系统中有多个处理器在独立地运行,即使能在单条指令中完成的操作也有可能受到干扰。
      在x86 平台上,CPU提供了在指令执行期间对总线加锁的手段。CPU芯片上有一条引线#HLOCK pin,如果汇编语言的程序中在一条指令前面加上前缀"LOCK",经过汇编以后的机器代码就使CPU在执行这条指令的时候把#HLOCK pin的电位拉低,持续到这条指令结束时放开,从而把总线锁住,这样同一总线上别的CPU就暂时不能通过总线访问内存了,保证了这条指令在多处理器环境中的原子性。
      当然,并不是所有的指令前面都可以加lock前缀的,只有ADD, ADC, AND, BTC, BTR, BTS, CMPXCHG,DEC, INC, NEG, NOT, OR, SBB, SUB, XOR, XADD, 和 XCHG指令前面可以加lock指令,实现原子操作。
      

  14.   

    根据MSDN的说法,lock (this) 是不良的习惯。lock 确保当一个线程位于代码的临界区时,另一个线程不进入临界区。如果其他线程试图进入锁定的代码,则它将一直等待(即被阻止),直到该对象被释放。线程处理(C# 编程指南) 这节讨论了线程处理。lock 调用块开始位置的 Enter 和块结束位置的 Exit。通常,应避免锁定 public 类型,否则实例将超出代码的控制范围。常见的结构 lock (this)、lock (typeof (MyType)) 和 lock ("myLock") 违反此准则:
    如果实例可以被公共访问,将出现 lock (this) 问题。如果 MyType 可以被公共访问,将出现 lock (typeof (MyType)) 问题。由于进程中使用同一字符串的任何其他代码将共享同一个锁,所以出现 lock(“myLock”) 问题。 最佳做法是定义 private 对象来锁定, 或 private static 对象变量来保护所有实例所共有的数据。
      

  15.   

    我个人的理解是,lock (this) 本身没有问题。但是如果滥用,有可能会造成死锁。因为它 lock 了一个其它线程也可能 lock 的对象。如果这个对象已经被 等待这个线程释放的那个线程 占用,那么双方都会陷入无限制的等待。
      

  16.   

    你只告诉了我这样是可以的 以及这样是为了什么 但我却想知道为什么lock(this) 与 lock(obj)是等价的
    括号中的表达式到底是什么意思 this与obj明明不是一个对象 为什么却能锁住同样的东西
    //==================这个只在特定条件下才可以this 指的是当前对象本身
    obj是值单独的一个对象两码事
      

  17.   

    为什么却能锁住同样的东西?因为对象本身是起到了令牌的作用。如同你到哪个商店去买锁,都可以把你家的门锁上。
    锁只是一个 token。
      

  18.   

    如果你不是把对象当成 token,那么这两个代码不是等价的。从逻辑上看,你锁上的只是这个代码路径而已。
      

  19.   


    但是根据MSDN说的好像他们是一样的啊
      

  20.   


    哦 我刚刚在MSDN上看见这段话:提供给 lock 关键字的参数必须为基于引用类型的对象,该对象用来定义锁的范围。在上例中,锁的范围限定为此函数,因为函数外不存在任何对该对象的引用。严格地说,提供给lock 的对象只是用来唯一地标识由多个线程共享的资源,所以它可以是任意类实例。然而,实际上,此对象通常表示需要进行线程同步的资源。例如,如果一个容器对象将被多个线程使用,则可以将该容器传递给 lock,而 lock 后面的同步代码块将访问该容器。只要其他线程在访问该容器前先锁定该容器,则对该对象的访问将是安全同步的。
    你的意思是不是这样?