前言
入坑的时候,erlang语言最吸引我的特性,就是支持高并发。这个支持体现在:1进程的代价极低,可以大量生成;2语言设计中没有锁一类的结构。然而我在很长一段时间内没明白,erlang是如何解决没有锁的情况下,并发造成的数据混乱的问题的。
思考
其实这种误解,很大一部分是源于我本身没有理解清楚锁的机制。锁的生成原因,是多个进程(线程)需要对同一份资源进行操作,而锁,是为了让这些进程排队,一个一个来。所以说,锁的本质是让并发变成串行。现在的技术始终没有太好的方法来解决这个问题,所以才诞生了锁这一无奈的概念。
其实erlang也是用了一种方法,用另一种实现让并发变成串行。这个模型叫做actor模型,这个方法名字叫做信箱。actor模型和邮箱,在我的理解里是这样的,以银行和用户为例子。假设有账户1,同时由用户a和用户b使用,那么账户1是一个actor,用户a和b各是一个actor,因为actor之间的通信都是由信件来的,所以当用户a和b有业务要处理的时候,就会生成信件发送到账户1的邮箱,账户1收到邮件后,就从最旧的开始处理,处理到邮箱为空。
这个模型的优势是:1没有锁,不会造成死锁的情况;2请求是并发的,无论先后都可以正常处理,一言以蔽之,这是一个更好的锁,一种不会造成死锁情况的锁。
这个模型的劣势是:虽然万物皆可actor,但人家已经写好了锁,比如数据库,想使用还是只能按照别人的来。
语法
loop() ->
receive
Data1 -> 操作1;
Data2 -> 操作2;
_ -> 防异常通配处理
end,
loop().
网友评论