我有一个包含整数的简单阻塞队列。在多线程环境中,我需要将元素添加到队列的后面。
BlockingQueue<Integer> test = new LinkedBlockingQueue<Integer>();目标是让加法按顺序进行..取be的顺序也是一样的。在我的程序输出的第5行,3不知何故排在队列的前面,尽管看起来是先添加了2。所有这些都是在单线程环境中添加的,所以我知道要添加的代码是按顺序执行的
Add: 1
Add: 2
Add: 3
Take: 1
Take: 3
Add: 4
Take: 2
Take: 4这是出乎意料的行为吗?目前,我只在单线程环境中进行了测试,因此我希望要求的顺序与添加的顺序保持一致。
有没有其他线程安全的数据结构,我应该用它来代替?
提前感谢你的帮助
发布于 2019-04-21 20:31:05
您需要确保获取和打印是一个原子操作,如果没有它,您可以拥有
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);
}https://stackoverflow.com/questions/55782553
复制相似问题