private static Object lock = new Object();
...
public void run(){
while(true){
synchronized(lock){
List<myObject> datas = dao.getDatas();
for(myObject data : datas){
myThread thread = new myThread();     
thread.start();     
}
}
}
}
public class myThread extends Thread{
public void run(){   
synchronized(xxx){
//do something
}
}
}
在XXX处,应该怎么写,才能让线程针对每个myObject对象获取锁。
比如说List<myObject> datas = dao.getDatas()从数据库中获取到2个对象,
data1,data2,可以有两个线程运行  do something  代码块。
当有新的线程时,判断要针对哪个对象,并判断是否有针对该对象的线程正在运行。
如果有则等待,否则继续等待。

解决方案 »

  1.   


    ...
    for(myObject data : datas){
                    myThread thread = new myThread(data);                   
                    thread.start();               
                }
    ...public class myThread extends Thread{   private myObject o = null;
       public myThread (myObject o){
        this.o = o;
    }
        public void run(){   
            synchronized(o){
                //do something                                   
            }
        }                           
    }
      

  2.   


    这个方法不行,因为每次从dao.getDatas()返回的对象值是不会变的,但是对象的标识(就是对象的内存地址)是会变的,因为每次dao.getDatas都是重新构造对象。
      

  3.   


    这个方法不行,因为每次从dao.getDatas()返回的对象值是不会变的,但是对象的标识(就是对象的内存地址)是会变的,因为每次dao.getDatas都是重新构造对象。

    那就在myObject中声明一个静态String,把返回的对象值 toString赋值给静态String,把静态String放在synchronized上呀。相同String的内存是相同的
      

  4.   


    这个方法不行,因为每次从dao.getDatas()返回的对象值是不会变的,但是对象的标识(就是对象的内存地址)是会变的,因为每次dao.getDatas都是重新构造对象。

    那就在myObject中声明一个静态String,把返回的对象值 toString赋值给静态String,把静态String放在synchronized上呀。相同String的内存是相同的
    高人啊,虽然我没有试验这么做是否好用,但是原理简单清晰,创意无限啊。
      

  5.   


    这个方法不行,因为每次从dao.getDatas()返回的对象值是不会变的,但是对象的标识(就是对象的内存地址)是会变的,因为每次dao.getDatas都是重新构造对象。

    那就在myObject中声明一个静态String,把返回的对象值 toString赋值给静态String,把静态String放在synchronized上呀。相同String的内存是相同的
    高人啊,虽然我没有试验这么做是否好用,但是原理简单清晰,创意无限啊。
    那就先谢谢夸奖啦