当然可能有同步问题,主要是你的zone变量。如果你的run操作要改变zone,你必须同步它。如下:
public void run(){
//对数据库表进行一些操作,但每个线程操作的都是表中不同的记录,根据zone来区分。
synchronized(zone)
{
     //Do something about the zone.
}
}

解决方案 »

  1.   

    不需要同步,如果要同步,可以通过关键字sychronized来解决!
      

  2.   

    你的问题在于在类的概念.
    类的成员函数为多个对象共有.
    而成员变量是对象私有的.
    你的代码中通过对象变量来确定线程的操作而成员变量不是共享资源.
    所以对于变量zone不应该同步.
    同步与否要看你有没有共享资源.
    你的同步应该在你的RUN()方法里.
    如果你经验丰富,
    可以同步代码段那是很高效的.
    语发格式:
    void fun()
    {
            sychronized(THIS)
          {
             ///需要同步的代码      }
    }
      

  3.   

    我可能写的不清楚,run中不会对zone变量做修改,我在run中的操作是:根据zone变量里某些成员变量的值来选择表中相应的记录。而且每个线程都有一个不同的zone。
    for(int i=0;i<10;i++){
      Zone zone = 从列表中取得一zone对象
      OperateThread operate = new OperateThread(Zone zone);//Zone为自定义类
      operate.start();
    }class OperateThread extends Thread{
      Zone zone = null;
      OperateThread(Zone zone){
        this.zone = zone;
      }
      public void run(){
    //对数据库表进行一些操作,但每个线程操作的都是表中不同的记录,根据zone来区分。
      }
    }
    主要是同时有多个线程在操作同一张表中的不同记录。我想不会有同步问题,你们以为呢?
      

  4.   

    你能保证多个线程操作的同一张表中的不同记录,这些记录完全不同吗?或者说这些记录之间没有任何关系吗?你可能会为了保证包括上述的种种问题而疲于奔命,就是因为不愿意使用同步。what ever,do as you wish!
      

  5.   

    agree Norwaywoods() ,你凭什么来保证zone所指的记录不相同?数据库有增删操作,保证不了的但仅synchronized(zone)其实也不起作用
    我觉得需要同步的是你正在修改某条记录的代码,你不能让一个线程修改某条记录,还没完成提交,而又让其它的线程来修改同样的记录
    具体怎么做,再想想
      

  6.   

    因为zone里放着表的关键字。根据关键字来取记录,这样可保证不同了吧
      

  7.   

    to greenboat(绿舟):
    假设:
    Zone zone1 = new Zone(10);
    Zone zone2 = new Zone(10);
    这两个肯定不是同一个对象吧,那你
    synchronized(zone){
    }
    有用吗?
    但这两者操作的还是同一条记录. 解决其实很简单,当你去修改某条记录的时候,在准备update那瞬间,把这条记录lock就可以拉
      

  8.   

    有空去看看:
    http://www.csdn.net/Develop/read_article.asp?id=17290