上篇文章中我们谈到,OOP当中的Object是一个个迷你计算机,他们之间通过消息传递相互影响。所以一个纯正的OOP系统应该是分布式去中心化的,就像整个互联网系统。
按照这个理念来设计系统,首先会碰到的问题就是如何处理时间。长久以来我们习惯于让CPU来决定时间,在处理并发执行的Object访问统一资源时,通过加锁来限制状态的错乱。这种方式容易让系统发生阻塞,而且每次状态更新都要考虑锁的问题,增加了编程的心智负担。
如果我们让时间变得去中心化,每个Object可以维护一套本地的虚拟时钟,记录这个Object内部事件发生的先后顺序。每个Object如同平行宇宙延续着自己的时间,彼此互不干扰,直到他们通过消息传递进行通讯,时间开始交错。
那么从全局系统角度来看,如何得出当前的时间进展呢?这里我们可以观察到两条基本定律:
1. 在每个Object内部如果事件A发生在事件B之前,那么“A的时间”必定小于“B的时间”
2. 在每次消息传递的过程中,消息的“发送时间”必定小于“接收时间”。
以下图为例,我们把Object A的内部事件的虚拟时间称为Ta1,Ta2 …,消息m2的发送时间为Tm2s,接受时间为Tm2r,其他Object类似。根据以上两条定律,Ta1在Ta2之前,Tm2s在Ta2之前,所以后者相比于前者需要加1,而对于消息m2接收时间Tm2r,需要取Tm2s和Tb2之间最大的一个,然后加1。

由此可以看出对于全局系统来讲,事件发生的先后顺序是什么。如果两个Object中的事件的逻辑时间相同,我们可以认为彼此并行执行,因为没有相互依赖关系。
利用虚拟时间,我们可以设计出很多Object的运行机制。我们可以把每次的状态变更都打上时间的标签,每次数据的读取和写入都对应着某个时间。我们可以规定消息的接收时间,如果小于当前时间,可以退回到特定的版本,重新执行那个时刻之后的消息队列。
正如虚拟内存帮助我们自动管理物理内存,虚拟时间可以帮助我们自动管理消息队列的执行顺序。由于不依赖一个中心化的CPU,这套机制可以方便地扩展到多台机器中。
