本帖最后由 weiyu523 于 2013-09-02 10:37:25 编辑

解决方案 »

  1.   

    如果是线程死锁,那还是你没控制好,比如lock需要lock一个全局的object,如果是数据库死锁,就是你的业务逻辑有问题或自己写的访问表的顺序有问题,造成表的死锁
      

  2.   


    已经加了一个lobject 的对象做为锁。
    但这样加,好像是一锁就把类里边的所有的Queue和DataTable都锁起来了,而其实,某些时候并不需要把所有的资源都锁起来,只是锁定某个特定的资源。这也是我头疼的问题。
      

  3.   

    你在线程运行的方法外部加一个lock就可以的啊,这样只运行一个线程去执行这个方法的
      

  4.   

    谢谢,不过或许这不是我想要的结果,原因:
    1、其实线程1与线程2中几乎没有共享的代码块,线程1与线程2中加载的方法也几乎是完全不同的
    2、线程1与线程2在更新共享的表之前,有很多预备工作,这些是不相互干扰的。只有在对表进行处理时才会需要锁住共享的表,而且此时只是需要锁定共享的表。但是如果用lock,是不是这个时候的两个队列也被锁定了?
    或者说,当我想锁定某一个Queue的时候,是不是此时另外一个Queue和共享的这个表也不能操作了?
      

  5.   

    OK本人已找到答案,希望对以后遇到相似问题的朋友有个帮助。lock(){}
    lock括号中的内容只是个标识,与要锁定的类成员无关。
    一般使用一个空object作为标识。
    如:object locker = new object();此处,当我要在某线程单独处理positionT时,只需要在线程方法中涉及positionT操作的地方加上lock(locker)
    当不同的线程遇到locker标识时,便会先判断locker是否被别的线程锁定,如果有,则等待。
    在没有lock(locker)的地方,线程正常运行。
    如果我要对几个资源分别上锁,其实可以定义多个空object锁分别对相关的操作进行互斥。