解决方案 »

  1.   

    两个界面文件中都有new出来新的类的实例,但由于这个方法是public static的,所以new的不同的类对象不影响吧。
      

  2.   

    不要把静态共有变量拿来lock,原则性的错误。然后要看你的代码了。
      

  3.   

    错了,,每个界面一个定时器。。这两个定时器会用相同的public static方法操作数据库,具体在使用的时候问题的原因是:定时器1可能刚把数据库打开,但方法还没运行结束,这个时候定时器2马上又把数据库关闭了,这个时候再转到定时器1的方法就出问题了。所以必须要线程同步。问题自己解决了,不过确实用的是lock锁定另一个类文件中的public static 的object对象引用。另外还试了一下在这个方法上加[MethodImpl(MethodImplOptions.Synchronized],这个是针对单独一个方法的同步,不再针对整个引用。虽然有不妥之处,但暂时没有什么更好的办法
      

  4.   

    你lock另一个类里面的obj1这个没有什么用,就是一片混乱.
    你两个界面调一个类,直接类里面lock本类的静态对象obj1就可以了.
      

  5.   

    如果不lock静态共有变量,那么lock还有什么用呢?主要不是为了实现同步吗?如果lock一个非静态本类的成员变量,那么我这样子使用你看会不会出问题
    while(true){//这里假设很多,用true表示
    A a=new A();
    a.Foo();
    }
    那么这段代码调用Foo里面就完全没有起到同步的作用啊.反而我觉得应该是要lock静态变量,主要是看什么个用法.当然如果临界资源不会超本类,那么lock非静态变量是正常的.
      

  6.   

    lock对象必须是同一个,才能互相锁住
    因为编译器是允许你同时有多对锁的,所以才需要你传递一个锁定的对象作为标识啊比如下面的例子:
    fun1()
    {
    lock(a){}
    }
    fun2()
    {
    lock(a){}
    }
    fun3(){lock(b){}}
    fun4(){lock(b){}}
    那么1和2互斥,3和4互斥,1和3可以同时执行
    那么如果你在类里做lock,要么被lock的对象是在类外面定义的一个公共变量,要么是在类里定义的静态变量
    否则每实例化一次,类里的变量都多一个实例出来,各自锁定不同的实例,编译器哪知道你是想各个实例之间互斥啊
      

  7.   

    多线程才需要lock  同步是单线程