日期:2014-05-19  浏览次数:20832 次

关于用Monitor进行同步的问题!!!!!
class   Program
        {
                static   int   i   =   11;
               
                static   void   Fun()
                {
                        Monitor.Enter(i);
                        i++;
                        Thread.Sleep(3000);
                        i++;
                        Monitor.Exit(i);
                       
                }

                static   void   Main(string[]   args)
                {
                        Thread   t1   =   new   Thread(new   ThreadStart(Fun));
                        Thread   t2   =   new   Thread(new   ThreadStart(Fun));
                        t1.Start();
                        t2.Start();
                }
             
        }
为什么报错   :从不同步的代码块中调用了对象同步方法???
我这样为什么不对?
我想让两个现成只有1个能改写i

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