我有一个简单的阻塞队列,其中包含整数。在多线程环境中,我正在将元素添加并添加到队列的后面。
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
这是意外行为吗?现在,我仅在单线程环境中进行过测试,因此我希望出队顺序与添加的顺序保持一致。
是否应该使用另一个线程安全数据结构?
非常感谢您的帮助
答案 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