并发Concurrency模式
Concurrency模式
- Shared-State Concurrency共享状态
- Message-Passing Concurrency消息
- Dataflow Concurrency数据流
- Software Transactional Memory软事务
Shared-State Concurrency共享状态
- 任何人任何时候都可以访问。
- 多线程机制
- 解决争夺使用lock锁。
锁的问题
- Locks do not compose无法组合
- Taking too few locks 锁要么使用太少
- Taking too many locks锁要么使用太多
- Taking the wrong locks要么可能用错了
- Taking locks in the wrong order顺序用错了
- Error recovery is hard 错误恢复比较难
避免锁的方法:尽量使用并发包
- java.util.concurrent.*
- • ConcurrentHashMap
- • BlockingQueue
- • ConcurrentQueue
- • ExecutorService
- • ReentrantReadWriteLock
- • CountDownLatch
- • ParallelArray
- • and much much more..
避免锁的方法:Message-Passing Concurrency
- 又称异步并发架构。
- 同步情况下:当你发出请求必然有一个响应结果,但是你可能接着还需要继续其他更多处理,不是立即用到这个响应结果。
- 这样,你不必发出请求后,就在那里傻等响应结果,而是继续做你其他更多处理,直到需要它时才过来取。
- 生活中排队,你去买两样东西,一样东西需要排队,那么先买不需排队的,再过来买。
异步机制2
- 等待线程闲置,会消耗系统资源。
- 对于一个高交互量的系统,线程闲置数= arrival_rate * processing_time)。如果arrival_rate很高,闲置数将非常高,系统工作在一个非常无效率的状态。
异步处理模型
- 使用异步处理模型asynchronous processing model来实现。
- Callback 回调
- Polling 拉
Callback模式
- 调用者当进行调用时,需要提供一个响应handler
- 被调用者在真正实际处理完成之前将立即首先返回结果。
- 当实际处理完成之后,响应将作为一个单独新的线程返回给之前已经注册了响应handler. 需要一些线程之间的协作和通讯。
Polling模式
- 被调用者在被调用时,自己立即返回一个"future" handle.
- 调用者获得这个“future” Handle后,不从中获取结果,而是先忙别的事情,然后,从“future”中查看响应是否已经处理好。
无线程之间协作需要处理。使用JDK6.0 future处理,Jdon框架Domain Events和Jivejdon大量使用该模式。
Actors模型
- 1973 paper by Carl Hewitt
- Erlang, Occam, Oz中实现
- 封装了状态 state 和行为 behavior
- 比类概念更加接近 OO
Actors模型特点
- Share NOTHING
- Isolated lightweight processes隔离轻量处理
- Communicates through messages通过消息联系
- Asynchronous and non-blocking异步且非堵塞
- No shared state没有共享的状态
- … hence, nothing to synchronize.也就没有需要锁同步。
- • Each actor has a mailbox (message queue)
Actors优点
- 易于reason about
- 提升抽象层次
- 能够避免下面情况:
- –Race conditions 竞争条件
- –Deadlocks 死锁
- –Starvation 饥饿
- –Live locks 永久锁
Actor libs for the JVM
- • Akka (Java/Scala)
- • scalaz actors (Scala)
- • Lift Actors (Scala)
- • Scala Actors (Scala)
- • Kilim (Java)
- • Jetlang (Java)
- • Actor’s Guild (Java)
- • Actorom (Java)
- • FunctionalJava (Java)
- • GPars (Groovy)
Dataflow Concurrency数据流并发
- Declarative 声明式的
- No observable non-determinism无明显的不确定性
- Data-driven – threads block until data is available
数据驱动,线程一直堵塞等待直至数据可用。 - On-demand, lazy 赖加载
- 缺点: can’t have side-effects
STM: 软事务
- 使用内存 (heap and stack)作为事务性的数据集
- 类似数据库database
- • begin
- • commit
- • abort/rollback
- • Transactions are retried
- • 回滚Rolls back the memory on abort
STM: 软事务
STM libs for the JVM
- Akka (Java/Scala)
- • Multiverse (Java)
- • Clojure STM (Clojure)
- • CCSTM (Scala)
- • Deuce STM (Java)
更多伸缩性scalable讨论