关于状态机的若干理解
状态机,英文表示是:State Machine ,不是指一台实际机器,而是指一个数学模型,仅仅是一组约束和规范,是不同状态进行相互转换的约束和规范。
状态机的数学模型包括四大部分:状态,事件,动作,转换。其中,事件来源于外界,而状态、动作和转换则与自身相关。
例如,对于一扇门而言,它的状态有open和close两种。当人进门的时候,推门就是外界作用给门的一个事件,而此时门的状态从close转换为open。
状态机的数学模型非常简单,理解起来毫不费力,但是落地到实际的应用却很少。原因很简单:反人性。一件十分简单的事情,仅仅通过if-else就可以搞定的事情,非要套上“状态机”这个思维枷锁,注定是失败的。
不过,在分布式场景中,状态机得到了广泛的应用。但是,此时出现了倍感滑稽的一幕:此状态机非彼状态机,上文提到的四个部分都已经被扔掉了。
在分布式场景中,当某个节点接受到操作指令之后,没有立即执行,而是先暂存起来,等集群大多数节点都接受到同样操作命令之后,才会执行命令。只有被执行的命令,才会作用于状态机。此时,状态机本质就变成了命令日志而已,早已经没有数学模型之说。在分布式场景下的状态机设计与实现是这个样子的:
public class StateMachine<T>
{
//存放外界下达的命令操作
public List<Command<T>> commands = new ArrayList<>();
//执行命令操作,修改状态机的状态
protected void apply(Command<T> command){}
//保存当前状态机的状态
public void saveState(DataOutputStream out){}
//从文件中状态机的状态
public void loadState(DataInputStream in){}
}
个人认为,学习状态机的理论并没有价值,因为它的内容十分简单,只有动手实战才能理解的更透彻,我通过实现一个分布式消息中间件从而加深了对状态机的理解,更多介绍请关注:http://www.mybatis.cn/archives/2283.html