比如有下面一个代码片段,它表示是同一个对象在多个线程中访问它会保持同步还是不同对象在多个线程中访问它会保持同步??有把这个问题讲的通俗易懂又非常清楚的资料或者书吗?谢谢各路大侠!
lock(a)   // private byte[] a = new byte[0];
{
    //do something...
}

解决方案 »

  1.   

    两个人要上WC,一人先进去了,他进去时,把门锁上,这时,第二个人没办法进去。
    直到第一个人上完WC,出来了,把门打开,第二个人才可以进去。
      

  2.   

    MSDN:
    lock 确保当一个线程位于代码的临界区时,另一个线程不进入临界区。如果其他线程试图进入锁定的代码,则它将一直等待(即被阻止),直到该对象被释放。
      

  3.   

    构造了一个代码,请大侠看看,两种运行结果为
    th1    th1
    3      6
    th2    th2
    6      6    class Program
        {
            static void Main(string[] args)
            {
                Test t1 = new Test();            Test t2 = new Test();            Thread th1 = new Thread(t1.T);
                th1.Name = "th1";
                
                // 下面两行互相注释运行出现两种不同的结果
                //Thread th2 = new Thread(t1.T);
                Thread th2 = new Thread(t2.T);            th2.Name = "th2";            th1.Start();
                th2.Start();
                
            }
        }    class Test
        {
            private byte[] b = new byte[0];        public static int m = 0;        public void T()
            {
                lock (b)
                {                m++;
                    m++;
                    Thread.Sleep(100);
                    m++;
                    Console.WriteLine(Thread.CurrentThread.Name);
                    Console.WriteLine(m.ToString());
                }
            }
        }
      

  4.   

    lock将语句块标记为临界区,确保当一个线程位于代码的临界区时,另一个线程不进入临界区。如果其他线程试图进入锁定的代码,则它将一直等待(即被阻止),直到该对象被释放。方法是获取给定对象的互斥锁,执行语句,然后释放该锁。
    http://www.cnblogs.com/0754ydj/archive/2008/12/18/1357677.html
      

  5.   


    明显不一样啊,th1 就打印出 6 ,说明 th2 已经进到lock 块里执行了 ++ 操作了,把 Sleep 时间设置长一点更加明显
      

  6.   

    一个是t1.T, 一个是t2.T,对像都不同,你Lock的不是同一个b。
      

  7.   

    用了lock 
    大括号{……}里的内容,是同步的
    就是说,一个线程执行了里面的内容,如果有第二个线程也想执行里面的内容,那就要等前面的那个线程执行完了后才能执行,在第一个线程执行的期间,后面的那个线程,一直在等待执行,除非第一个执行完了
      

  8.   

    lock必须设定在一个对象上,通俗的讲,在这个对象上加个锁。可以有多处代码对同一个对象加锁。线程执行中遇到了lock,就会检查此对象是否已被锁定,若是则等待,若不是则加锁,进去执行,完了解锁,等待队列中的下一个线程就可以进去执行了。
    所以一般不要在实例中lock(this),因为实例的使用者也可能会lock此实例,容易导致死锁。若要在实例内部进行全局加锁,推荐创建一个私有成员,如object _thisLock=new object();把需要lock(this)的地方,替换为lock(_thisLock)。此例中也可以看出加锁与要锁的对象(类的实例)无关,锁仅是线程同步中的一种束定。并非你lock(someObject)后,其他线程就不能访问someObject,而是其他线程执行到同样的lock(someObject)代码段时需要审查锁的状况。
      

  9.   

    观察lock的MSIL码,可以发现与下述代码的MSIL码等同:try
    {
       Moniter.Enter(someObject); //尝试进入临界区
       //do something
    }
    catch{} //异常被忽略,没有任何处理
    finally
    {
       Moniter.Exit(someObject);  //退出临界区
    }所以,若是确认不会发生异常的代码段加锁,推荐直接使用Moniter,因lock进行了异常检测,效率会有所损失。只有代码段可能会抛出异常且此异常无需处理的时候,才推荐使用lock。
      

  10.   

    就是临界区,用于线程同步,楼上有几位仁兄已经解答了。
    你要资料的话,看看下面msdn在线连接,有实例。
    http://msdn.microsoft.com/zh-cn/library/c5kehkcz.aspx