gpt4 book ai didi

java - 阻塞队列取出无序

转载 作者:行者123 更新时间:2023-12-02 06:26:34 25 4
gpt4 key购买 nike

我有一个包含整数的简单阻塞队列。在多线程环境中,我正在获取元素并将其添加到队列的后面。

BlockingQueue<Integer> test = new LinkedBlockingQueue<Integer>();

目标是按顺序添加..并按相同的顺序获取。在我的程序输出的第 5 行,3 在 2 之前以某种方式位于队列的前面,尽管看起来 2 是先添加的。所有这些都是在单线程环境中添加的,因此我知道要添加的代码是按顺序执行的

 Add: 1
Add: 2
Add: 3
Take: 1
Take: 3
Add: 4
Take: 2
Take: 4

这是意外行为吗?目前我仅在单线程环境中进行测试,因此我希望出队顺序与添加的顺序保持一致。

我应该使用另一种线程安全的数据结构吗?

感谢您提前提供帮助

最佳答案

您需要确保获取和打印是一个原子操作,否则您可以拥有

T1: take a number say 1
T2: take a number say 2
T2: print a number 2
T1: print a number 1

即除非您确保按照取值的顺序打印,否则它可以按任何顺序。

使用 System.out 上的锁进行打印,以便您可以使用它使其原子化

synchronized (System.out) {
Integer task = queue.take();
// no chance of a race condition here.
System.out.println("took " + task);
}

关于java - 阻塞队列取出无序,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55782553/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com