如果线程1正在运行lock(obj){}内的代码,这时候线程2调用一个obj的方法,线程2会被sleep么?还是说如果想在此时令线程2sleep,必须要为线程2调用的obj的方法加上lock?

解决方案 »

  1.   

    lock(obj){}是保证在同一时间内只有一个线程在此范围内运行
    这时候线程2调用一个obj的方法,线程2会被sleep么?
    --------------------------------------------------
    不是,这个和obj的方法无关
    还是说如果想在此时令线程2 sleep,必须要为线程2调用的obj的方法加上lock
    --------------------------------------------------
    理解错误如果有一线程在lock范围内执行,那么另一线程只有等第一个线程从lock返回内出来才可以执行lock内的程序
      

  2.   

    也就是说即使为线程2调用的obj的方法(如obj.a())上lock(obj)也不能起到sleep的作用了?那如果我想实现:
    只要线程1正在运行lock(obj){}的代码时,线程2调用obj.a()就sleep,直到线程1释放obj。
    要如何做呢?
      

  3.   

    lock(obj)
    {
        obj.a();
    }
      

  4.   

    我认为应该这样理解的:obj在lock时,应该抽象为“互斥对象”,“临界资源”,等同于一把锁,一扇门。lock(obj)  //在这里把门给锁上了
    {
    .....  //只有进门的线程可以执行这些代码,门外的线程必须等候
    }
    .....  //在这里门开了,可以放进另一个等候的线程进来执行。
    所以,通常
    object objSync = new object(); //声明这把锁,而不关心objSync是属于哪个类的,有哪些方法。
      

  5.   

    不会,必须lock(obj),所有引用obj的地方都必须lock(obj)才可以串行化访问
      

  6.   

    谢谢楼上大侠们的回复~顶楼的问题已经解释的很清楚了~~现在的问题是:如果线程1正在运行任意obj的方法(如obj.a()),那么任何其他线程都禁止访问obj的任何方法,怎么做呢?我能想到的就是在每一个方法开始和结束的时候加个bool的变量判断,如:bool objFree = true;
    void a()
    {
      while (!objFree)
      {
        Thread.Sleep(100);
      }
      objFree = false;  /******* Do something *******/  objFree = true;
    }将所有obj类的方法都写成上述格式,请问还有更好的办法么?
      

  7.   

    采用一个ManualResetEvent对象A。每个操作之前都做A.WaitOne,如果返回false,说明别的地方在使用A,函数返回。如果返回是true,那么执行A.Set,随后开始操作你的obj。操作完之后记得要A.Reset。请格外注意你的操作可能会引发异常,那么要用try finally保证Reset发生。而A的作用域最好和obj一致,这样可以保证A可以随时保护obj。