首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >阻塞队列无序

阻塞队列无序
EN

Stack Overflow用户
提问于 2019-04-21 20:05:10
回答 1查看 201关注 0票数 1

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

代码语言:javascript
复制
BlockingQueue<Integer> test = new LinkedBlockingQueue<Integer>();

目标是让加法按顺序进行..取be的顺序也是一样的。在我的程序输出的第5行,3不知何故排在队列的前面,尽管看起来是先添加了2。所有这些都是在单线程环境中添加的,所以我知道要添加的代码是按顺序执行的

代码语言:javascript
复制
 Add: 1
    Add: 2
    Add: 3
    Take: 1
    Take: 3
    Add: 4
    Take: 2
    Take: 4

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

有没有其他线程安全的数据结构,我应该用它来代替?

提前感谢你的帮助

EN

回答 1

Stack Overflow用户

发布于 2019-04-21 20:31:05

您需要确保获取和打印是一个原子操作,如果没有它,您可以拥有

代码语言:javascript
复制
T1: take a number say 1
T2: take a number say 2
T2: print a number 2
T1: print a number 1

也就是说,除非您确保打印的顺序与取值的顺序相同,否则可以按任何顺序打印。

System.out上使用锁进行打印,这样您就可以将其设置为原子的

代码语言:javascript
复制
synchronized (System.out) {
    Integer task = queue.take();
    // no chance of a race condition here.
    System.out.println("took " + task);
}
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/55782553

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档