并发编程的三要素是:
并发编程就是关于如何抽象, 封装和操作三要素的艺术.
并发编程的源头是在于内存中的数据需要在不同的线程之间共享, 因为多线程程序在运行时存在交错(interleaving).
数据在内存中的存储可以分为:
所有并发编程都是以任务为抽象的设计单元, 一个线程可以在他的生命周期里处理若干任务, 而任务间, 线程间总会存在着依赖关系.
我们将任务抽象成五个要素:
通常来说, 并发编程范式分为三种:
CSP是由Tony Hoare在1978的论文上首次提出的. CSP将程序分为Processor和Channel两个部分:
除了Channel, Processor间没有其他联系, 这样就将并发同步作用缩小在了Channel, 问题规模得到了规约. CSP使得系统较为清晰, Processor之间解耦, 职责明晰.
CSP规范了:
CSP的设计哲学是:
Do not communicate by sharing memory, instead, share memory by communicating.
并发编程不要利用共享内存来进行线程通信, 而应该依靠通讯来共享数据. 尽量避免锁和线程争用.
Actor模型是由Carl Hewitt于1973年提出, 后由Erlang OTP提出. Actor属于并发组件模型, 通过组件方式定义并发编程范式的高级阶段, 避免使用者直接接触多线程并发或线程池等基础概念, 其消息传递更加符合面向对象的原始意图.
传统多数流行的语言并发是基于多线程之间的共享内存, 使用同步机制来防止写争夺. 而Actor使用消息模型, 每个Actor在同一时间处理最多一个消息, 可以发送消息给其他Actor, 保证来单独写原则.
Actor模型不仅仅对于单机的并发应用开发有意义, 对于分布式应用的开发也是一个可以大展手脚的场景: 节点之间相互独立, 只能靠消息通讯, 异步消息避免节点瓶颈等特性都非常贴合Actor都使用.
Actor模型特点:
以C语系为代表的过程式编程语言, 在处理并发编程时, 通常是使用同步工具来完成, 这些工具按照抽象级别分为: