刚遇到一个问题,一个线程从数据库中取给定条数的数据,放入ArrayBlockingQueue中,另外有10个线程一直在运行,同时从ArrayBlockingQueue中take数据,然后进行处理(每个线程处理一个,处理过程比较长,所以才用多线程),可是现在遇到的问题就是,在从数据库中一次取1条数据的时候,本来设想的情况是只有一个线程能从ArrayBlockingQueue中取出数据,其他线程进入等待.可是现在的情况却是,这10个线程同时获取了同样的数据,而且,第二次循环的时候还是会出现同样的数据.如果一次从数据库中取出5条,那么就会随即冗余某几条数据,请问应该如何解决?

解决方案 »

  1.   

    这10个线程需要用synchronized锁同步。
      

  2.   

    我把take方法放在了synchronized代码块中,对ArrayBlockingQueue加了锁.单步执行证明锁是加上了,只有一个线程能take,其他线程需要等待,但是问题依然没有解决,在其他线程获取锁之后,它得到的数据仍然是和第一个得到锁的线程一样的,也就是10个线程获取的都是同样的数据,并没有被take掉.
    我现在只能对这个take方法加锁,然后就是调用http请求的方法,这个时间需要比较长.