多个线程同时从ArrayBlockingQueue中取数据冗余

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了多个线程同时从ArrayBlockingQueue中取数据冗余相关的知识,希望对你有一定的参考价值。

刚遇到一个问题,一个线程从数据库中取给定条数的数据,放入ArrayBlockingQueue中,另外有10个线程一直在运行,同时从ArrayBlockingQueue中take数据,然后进行处理(每个线程处理一个,处理过程比较长,所以才用多线程),可是现在遇到的问题就是,在从数据库中一次取1条数据的时候,本来设想的情况是只有一个线程能从ArrayBlockingQueue中取出数据,其他线程进入等待.可是现在的情况却是,这10个线程同时获取了同样的数据,而且,第二次循环的时候还是会出现同样的数据.如果一次从数据库中取出5条,那么就会随即冗余某几条数据,请问应该如何解决?
我按照你说的加了synchronized代码块,对ArrayBlockingQueue加锁.中间是take方法.单步执行证明锁是加上了,只有一个线程能take,其他线程需要等待,但是问题依然没有解决,在其他线程获取锁之后,它得到的数据仍然是和第一个线程一样的,也就是10个线程获取的都是同样的数据,并没有被take掉.

给ArrayBlockingQueue加把锁,
如果需要读取它的资源,需要首先拿到这把‘锁’,拿到资源后再放开锁;

所有线程都需要首先拿锁;

这样做可避免你说的问题.

补充:
这可能是take操作的问题,查查msdn,take操作会在取到数据后把数据从ArrayBlockingQueue删掉吗?如果不会,那么你需要手动加入code把该数据删掉,删除操作要在解锁前做。
参考技术A 线程同步

以上是关于多个线程同时从ArrayBlockingQueue中取数据冗余的主要内容,如果未能解决你的问题,请参考以下文章

阻塞队列之ArrayBlockingQueue源码分析

阻塞队列之ArrayBlockingQueue源码分析

使用 ArrayBlockingQueue 和 mutex 的多线程代码中的疑点

源码阅读(33):Java中线程安全的QueueDeque结构——ArrayBlockingQueue

源码阅读(33):Java中线程安全的QueueDeque结构——ArrayBlockingQueue

LinkedBlockingQueue与ArrayBlockingQueue