阻塞队列乱序

时间:2019-04-21 12:05:10

标签: java multithreading data-structures thread-safety blockingqueue

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

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

目标是按顺序添加。并按相同的顺序进行。在我的程序输出的第5行上,尽管3似乎先被添加了,但3在2之前一直处于队列的最前面。所有这些都是在单线程环境中添加的,所以我知道要添加的代码是按顺序执行的

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

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

是否应该使用另一个线程安全数据结构?

非常感谢您的帮助

1 个答案:

答案 0 :(得分:0)

您需要确保取纸和打印是原子操作,而您不能拥有

class MyModel(models.Model):
    key = models.CharField()

    def delete(self, **kwargs):
        if self.key == 'my-undeletable-key':
            raise MyCustomException()
        super(MyModel, self).delete(**kwargs)

即除非您确定打印顺序与取值顺序一致,否则打印顺序可以任意顺序。

使用T1: take a number say 1 T2: take a number say 2 T2: print a number 2 T1: print a number 1 上的锁进行打印,因此您可以使用它来使其原子化

System.out