假设现在有线程TA,TA里的run()方法会调用一个DAO借口实现,DAO里会对一个表进行判断,然后写操作。 
public class TA extends Thread{ 
BusinessDAO bDAO; public TA(BusinessDAO daoArg){ 
bDAO = daoArg; 
} public run(){ 
boolean b = bDAO.findExist(dataList); 
if(!b){ 
bDAO.insert(dataList); 
}else{ 
bDAO.update(dataList); 


} 请问我现在如何做到就是run()方法体内的代码在一个时刻内只有一个实例在运行?也就是说 
bDAO.insert(dataList);这行代码在运新的时候,系统内只有一个dataList被传入,然后跟我的数据库系统已有的数据比较,然后得出结论,然后更新数据库状态。 
这样做的原因是我现在的系统老是出现这样的情况,连续传2次dataList,按说第一次判断系统中没有这个datalist后,将这个dataList的值写入到数据库,那么第2次应该会判断出已经有了这个数据,但是实际情况不是,第二次判断仍然得出是没有的结论。而且在传入多次的情况下,结果都是一样。 
这种结果从表面上看来就好像2次上传,第一次和第二次毫无关系一样,难道是2次是并发执行了? 请问这可能是什么原因造成的?那么我如何控制这种并发,保证我第一次判断,然后写入,然后才执行我第二次判断,第二次写入。 
这个bug跟我的数据库的事务设置有关吗? 
怎么解决这个问题? 还是要将我的程序设置成Singleton模式的? 怎么将我的程序设置成singleton模式的? 我的程序的实际架构是:Struts1.2+Spring2.0+iBatis3,以上的代码我抽象了一下。 线程TA是通过Spring的 
org.springframework.core.task.TaskExecutor来调度的。

解决方案 »

  1.   

    声明一个对象 Object lock = new Object();
    然后:
    public run(){ 
    synchronize(lock){
    boolean b = bDAO.findExist(dataList); 
    if(!b){ 
    bDAO.insert(dataList); 
    }else{ 
    bDAO.update(dataList); 
    }} 

    同步一下就行了.
      

  2.   

    楼主你的意思是不是启动了两个线程,每个线程做一个dataList?
    如果是这样子的话,这两个线程之间是有关联的,也就是说第二个被启动的线程要在第一个被启动的线程做完以后才能做。是不是这样?如果是这样子的话,我觉得使用多线程似乎没有什么好处
      

  3.   

    当然你可以使用关键段同步就是把你的run()里面的代码块同步。写法上面的兄弟已经给出来了
      

  4.   

    dao在spring里默认singlton,你再序列化一下就能保证了
      

  5.   

    不是启动了两个线程,只有一个线程,解决办法应该如CsSpider588那位所说的.
      

  6.   

    多线程的问题,给你要同步的代码加上synchronized