第六章:通信顺序进程(CSP)

1.介绍

CSP模型看上去类似于actor模型,但是区别在于:actor模型的重点在于参与交流的实体,而CSP模型的重点在于用于交流的通道。

2. CSP和Actor

简单来说actor模型的第一类对象是并发执行的实体actor而CSP模型的第一类对象是传递消息的通道。

使用actor模型的程序是由独立的、并发执行的实体(actor,Elixir中称为进程),这些实体之间通过发送消息进行通信。每个actor都有一个信箱,用于保存已经收到但尚未被处理的消息。

与actor模型类似,CSP模型也是由独立的、并发执行的实体组成,实体之间也是通过发送消息进行通信。但两种模......

第五章:Actor

1. 介绍

函数式编程不使用可变状态,也就避免了共享可变状态带来的问题。相比之下,使用actor模型保留了可变状态,只是不进行共享。

actor类似于面向对象编程中的对象——其分封装了状态,并通过消息与其他actor通信。两者的区别是所有actor可以同时运行、actor之间的消息传递是真实地在传递消息,这与OO式的消息传递(实质是调用了一个方法)不同。

2. Actor中的消息和信箱

我们例子使用Elixir语言来写,这种语言基于erlang虚拟机。erlang vm原声对actor并发模型有良好的支持。

2.1 收发消息

如下代码定义了一个actor用来接受......

第四章:分离标识与状态

原子变量前面已经说过。SMT可以参考这篇文章

将对内存的访问封装在事务(transactions)中,Clojure消除了内存同步过程中我们易犯的那些错误。clojure提供了ref关键字来定义SMT对象。有冲突的话SMT对象就会像事务一样自动回滚重做。

SMT具有RDBMS中事务的ACI特性,没有持久性。

还有java配合akka就可以使用SMT。java不断的在进步啊~

第三章:函数式编程

1.概要

函数式编程——将计算过程抽象成表达式求值。这些表达式由纯数学函数构成,这些数学函数式第一类对象(我们可以像操作数值一样操作第一类对象)并且没有副作用。函数式编程可以更容易做到线程安全,因此特别适合并发编程。之前Java中提到的锁就是为了应对共享的可变状态,但是函数式编程没有可变状态,所以不会遇到由共享可变状态带来的种种问题。

2.可变状态的风险——隐藏和逃逸

我们来回顾一下Java语言中可变状态的问题

2.1 隐藏的可变状态

即使你以为你自己写了一段不存在可变状态的代码,但是仍然可能由于使用 了Java的某些类,使得其在多线程环境是线程非安全的。

2.2......

第二章:线程与锁(站在巨人肩膀上)

1. 概览

这一小节内容之所取名站在巨人肩膀上,是告诉我们要善用那些已经有大牛写好的工具。当然我们这里说的还是java

2.创建线程

在服务器上,每个请求有一个对应的处理线程,如果使用普通创建线程的方法,会有以下问题:

不断的创建和销毁线程存在代价

当请求链接的速度高于处理链接的速度时,线程数量会不断增长,导致服务器停止服务而崩溃。这给那些相对服务器进行拒绝服务供给的人提供了可乘之机。

可以采用Executors里面的方法来创建线程池

线程池设置多大的一般性准则:对于CPU密集型的任务,线程大小应该接近于核数;对于IO密集型任务,线程池可以设置的大一些。......