当我们说顺序时, 我们在说什么?
日常思维中, 顺序大部分情况会和时间关联起来, 即时间的先后表示事件的顺序关系.
比如事件 A 发生在下午 3 点一刻, 而事件 B 发生在下午 4 点, 那么我们认为事件 A 发生在事件 B 之前, 他们的顺序关系为先 A 后 B.
上面的例子之所以成立是因为他们有相同的参考系, 即他们的时间是对应的同一个物理时钟的时间. 如果 A 发生的时间是北京时间, 而 B 依赖的时间是东京时间, 那么先 A 后 B 的顺序关系还成立吗?
如果没有一个绝对的时间参考, 那么 A 和 B 之间还有顺序吗, 或者说怎么断定 A 和 B 的顺序?
显而易见的, 如果 A,B 两个事件之间如果是有因果关系的, 那么 A 一定发生在 B 之前(前因后果, 有因才有果). 相反, 在没有一个绝对的时间的参考的情况下, 若 A,B 之间没有因果关系, 那么 A,B 之间就没有顺序关系.
那么, 我们在说顺序时, 其实说的是:
有绝对时间参考的情况下, 事件的发生时间的关系;
和没有时间参考下的, 一种由因果关系推断出来的 happening before 的关系;
在分布式环境中讨论顺序
当把顺序放到分布式环境 (多线程, 多进程都可以认为是一个分布式的环境) 中去讨论时:
同一线程上的事件顺序是确定的, 可以认为他们有相同的时间作为参考
不同线程间的顺序只能通过因果关系去推断
(点表示事件, 波浪线箭头表示事件间的消息)
上图中, 进程 P 中的事件顺序为 p1->p2->p3->p4(时间推断). 而因为 p1 给进程 Q 的 q2 发了消息, 那么 p1 一定在 q2 之前(因果推断). 但是无法确定 p1 和 q1 之间的顺序关系.
- long orderId = ((Order) object).getOrderId;
- return mqs.get(orderId % mqs.size());
来源: https://www.cnblogs.com/hzmark/p/orderly_message.html