并发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)

Actor模型

 


 

Dataflow Concurrency数据流并发

  • Declarative 声明式的
  • No observable non-determinism无明显的不确定性
  • Data-driven – threads block until data is available
    数据驱动,线程一直堵塞等待直至数据可用。
  • On-demand, lazy 赖加载
  • 缺点: can’t have side-effects

dataflow

 数据流

 


 

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)

AKKA框架

Java并发专题

下页

更多伸缩性scalable讨论