问题


用户A的操作

(1)开始事务
(2)操作资源1
(3)操作资源2
(4)提交事务

用户B的操作

(1)开始事务
(2)操作资源2
(3)操作资源1
(4)提交事务

如果用户A和用户B的两个事务同时发生,A锁住了资源1,B锁住了资源2,互相等待,陷入死锁

如果采用同步锁synchronized,可能会出现破坏逻辑一致性的问题

这个问题的根本原因:数据是被动的被处理

在读多写少,较少涉及事务机制的场景下,这个问题不明显,否则就面临此问题

Actor模型


Actor模型就是用来解决事务并发问题的

Actor模型 = 数据 + 行为 + 消息

上面的问题是因为数据是被动的,那么Actor模型就让数据有了自己的行为意识,不让别人处理自己的数据,别人只能通过消息的发送,激发行为处理数据,保证Actor内部数据只能被自己修改

传递消息是Actor模型的基础,这个过程类似收发邮件

(1)用户A给用户B发送了一封邮件

(2)用户B在合适的时候去检查邮箱,收到邮件,进行处理

(3)处理后给用户A发送一封确认结果的邮件

(4)用户A也会在合适的时候去检查邮箱,接收邮件

邮件就是消息,处理邮件就是对自己的数据执行相应的行为,用户A并不处理用户B的数据,只是发送消息告诉用户B处理

对于并发的情况也一样,因为每个参与者都有自己的邮箱,每封邮件都会按照它们到达的顺序被处理

所以,Actor模型固有了处理并发的特性

Actor模型的口号是:一切皆Actor,这和面向对象的‘一切皆对象’很相似,但面向对象是顺序性的,而Actor模型固有并发的特质

Actor是一个个独立的实体,他们之间毫无关联,只有发送消息这一种通信方式,消息让Actor之间解耦,消息传递形式简化了并行程序的开发

消息的类型、内容是任意的,有点像webservice,只传递消息,不必了解是如何实现的

Erlang,Go,Scala等语言都是支持Actor模型的