int test = 0;
        Stopwatch sw = new Stopwatch();
        sw.Start();
        for (int i = 0; i < 10000; ++i)
        {
            Monitor.Enter(test);
            try
            {
                test = i;
            }
            finally
            {
                Monitor.Exit(test);
            }
        }
        sw.Stop();
        Console.WriteLine(sw.Elapsed);
这段代码进行到finally里会抛出异常,而如果用lock代替Monitor来锁的话却不会有异常出现,这是什么原因呢?

解决方案 »

  1.   

    楼主,以后先去看看MSDN这次我帮你摘一段:使用 Monitor 锁定对象(即引用类型)而不是值类型。将值类型变量传递给 Enter 时,它被装箱为对象。如果再次将相同的变量传递给 Enter,则它被装箱为一个单独对象,而且线程不会阻止。Monitor 本应保护的代码未受保护。此外,将变量传递给 Exit 时,也创建了另一个单独对象。因为传递给 Exit 的对象和传递给 Enter 的对象不同,Monitor 将引发 SynchronizationLockException。有关详细信息,请参见概念性主题 监视器。
      

  2.   

    而用lock则只传递一次test,实际使用的是装箱后的同一个对象
      

  3.   

    同意2L,以下代码可以看出。
    进入
       IL_0005:  nop        
          IL_0006:  ldc.i4.s   100
          IL_0008:  call       void [mscorlib]System.Threading.Thread::Sleep(int32)
          IL_000d:  nop        
          IL_000e:  nop        
          IL_000f:  ldarg.0    
          IL_0010:  ldfld      object WindowsApplication1.Form1::t
          IL_0015:  dup        
          IL_0016:  stloc.1  
          IL_0017:  call       void [mscorlib]System.Threading.Monitor::Enter(object)
          IL_001c:  nop 
    退出
         IL_0046:  nop        
          IL_0047:  leave.s    IL_0051
          IL_0049:  ldloc.1    
          IL_004a:  call       void [mscorlib]System.Threading.Monitor::Exit(object)
          IL_004f:  nop        
          IL_0050:  endfinally 
          IL_0051:  nop