《java并发编程实战》

介绍了一些并发编程的设计规则和思维模式


初识并发编程可以参见

多线程的优势

  • 发挥多处理器的能力
  • 建模简单:当手头只有一项工作时,只需要埋头苦干,可当有多项任务时,就需要花精力去考虑任务的安排,对于软件也是,如果为每种类型的任务都分配一个专门的线程,就可以形成串行执行的假象,就好像所有人都在专注于自己手头的事情,并只在特定的同步位置进行交互,上述目的可以通过Servlet和RMT等框架实现,框架会处理请求管理、线程创建、负载平衡等细节问题,而对于开发人员都不需要了解这些,看起来就像一个单线程程序
  • 异步时间的简化处理:单线程应用在遇到读写阻塞的时候,对于其他处理也将停顿,为了处理这个问题,单线程应用使用非阻塞I/O,这种I/O的复杂性远高于同步I/O。但是如果每个请求都对于一个处理线程,也能解决上述问题。早期的操作系统只能创建少量的线程,大约在几百个,因此像Unix就提供一些方法来实现多路I/O,例如select和poll系统调用,为了调用这些方法,Java类库提供了一组实现非阻塞I/O的包(NIO)。如今线程数量大幅提升(可达数十万个),有能力给每个客户端提供一个线程

线程无处不在

  • 当JVM启动时,会为JVM的内部任务(垃圾回收、终结操作)创建后台进程,并创建一个主线程来运行main方法。
  • 框架通过在框架线程中调用应用程序代码将并发性引入程序中,在代码中将不可避免地访问应用程序状态,因此所有访问这些状态的代码路径都必须是线程安全的,因此对于线程安全性的需求在程序中蔓延开来

下面的模块都将在应用程序之外的线程中调用应用程序的代码

  • Servlet和JavaServer Page(JSP):Servlet框架用于部署网页应用程序以及分发来自HTTP客户端的请求,到达服务器的请求可能会通过一个过滤器链被分发到正确的servlet或JSP,每个servlet都是一个程序逻辑组件,多个客户端可能同时请求同一个servlet服务,因此在servlet框架中需要满足servlet被多个线程同时调用,即servlet需要是线程安全的
  • RMI:使代码能够调用在其他JVM中运行的对象。当RMI调用某个远程方法时,传递给方法的参数必须打包到一个字节流,通过网络传输给远程JVM,再由其拆包并传递给远程方法