美文网首页netty
【erlang】erlang是如何解决其他语言的锁的问题的

【erlang】erlang是如何解决其他语言的锁的问题的

作者: 夏澪 | 来源:发表于2019-06-04 10:26 被阅读0次

    前言

    入坑的时候,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().
    

    相关文章

      网友评论

        本文标题:【erlang】erlang是如何解决其他语言的锁的问题的

        本文链接:https://www.haomeiwen.com/subject/ajtlxctx.html