java 如何获取固定大小的队列

ql3eal8s  于 2023-06-28  发布在  Java
关注(0)|答案(2)|浏览(126)

我试图在java中创建一个固定大小的队列,我只想在队列中存储最多10个对象。但是,队列继续存储/添加对象,并忽略if条件。
我的代码:

Queue<Customer> sitt = new LinkedList<Customer>();
if(sitt.size() < 10) {
   System.out.println("Added");
   ((LinkedList<Customer>)sitt).offer(cust); 
} else {
   System.out.println("No space..");
}

我有另一个Runnable类,我正在运行22个线程。此条件应仅添加Customer类的0-9对象。然而,sitt.size()甚至超过20。有谁能告诉我出了什么问题吗?甚至if条件也被忽略。
P. S:我在这里使用队列的原因是因为我需要FIFO。

cgvd09ve

cgvd09ve1#

您可以只使用java.util.concurrent中的LinkedBlockingQueue-它允许您指定队列的固定大小。

new LinkedBlockingQueue<>(10);

然后,您可以使用offer()方法向其中插入值,该方法将不执行任何操作,如果队列已满,则返回false

gwo2fgha

gwo2fgha2#

很明显,这样的实现会有问题--从多个线程访问共享资源(队列),而它们之间没有任何同步。这导致所谓的“竞争”条件。在极端情况下:所有线程读取size,其等于0。所有线程执行条件体并添加新元素。
我会使用一些公共解决方案来实现“共享(阻塞)循环队列”,或者通过线程安全(通过锁定或其他方式)“数组中的整数计数器”来实现它。

相关问题