【发布时间】:2014-05-12 14:43:09
【问题描述】:
假设有 2 个线程在共享队列 @987654321@ 上执行操作。每个线程的代码行都有编号,最初队列是空的。
线程 A:
A1) q.enq(x)
A2) q.deq()
线程 B:
B1) q.enq(y)
假设执行顺序如下:
A1) q.enq(x)
B1) q.enq(y)
A2) q.deq()
因此我们得到y(即q.deq() 返回y)
这个执行是基于一本著名的书,据说是顺序一致的。请注意,方法调用不重叠。这怎么可能呢?我相信线程 A 在执行 A1 之前没有实际更新队列,直到它进入 A2 行,但这只是我的猜测。如果我从 Java 语言规范中看到这个解释,我会更加困惑:
顺序一致性是对程序执行中的可见性和顺序的非常强大的保证。在顺序一致的执行中,所有单独的操作(例如读取和写入)都有一个与程序顺序一致的总顺序,并且每个单独的操作都是原子的并且对每个线程立即可见。
如果是这样的话,我们会出队x。
我确定我错了。有人可以解释一下吗?
【问题讨论】:
-
是什么样的队列?先进先出?菲洛?
-
哦,我忘了最重要的部分:它是先进先出
-
您的错误是您假设 A 的动作作为一个整体以原子方式发生。它们分别是原子的。
标签: multithreading concurrency