java并发多面性

    编程问题中大部分都是可以通过顺序编程来解决。然而对于某些问题,如果能够并行地执行程序中的多个部分,则会变得非常方便甚至很有必要,

因为这些部分要么看起来在并发地执行,要么在多处理器环境下执行。(并发跟并行是两个概念)

一、什么是并发

  在操作系统中,并发是指一个时间段中有几个程序都处于已启动运行到运行完毕之间,且这几个程序都是在同一个处理机上运行,但任一个时刻点上只有一个程序在处理机上运行。
在关系数据库中,允许多个用户同时访问和更改共享数据的进程。SQL Server 使用锁定以允许多个用户同时访问和更改共享数据而彼此之间不发生冲突。

二、关于javaweb系统上的并发

  web系统是最常见的java应用系统之一,而基本的web库类、servlet具有天生的多线程性,因为web服务器经常包含多个处理器,而并发是充分利用这些处理器的理想方式。

即便是像servlet这样看起来很简单的情况,你也必须理解并发问题,从而正确地使用它们。

三、并发多面性

  并发编程令人疑惑的一个主要原因是:使用并发时需要解决的问题有多个,而实现并发的方式也有多种,并且在这两者之间没有明显的映射关系(而且通常只具有模糊的界线)。

用并发解决的问题大体上可以分为“速度”和“设计可管理性”两种。

  1、更快的执行

  如果你想要一个程序运行的更快,那么可以将其断开为多个片段,在单独的处理器上运行每个片段。但是并发通常是提高运行在单个处理器上的程序和性能。

在单个处理器上运行的并发程序开销确实应该比该程序的所有部分都顺序执行的开销大,因为其中增加了所谓的上下文切换的代价(从一个任务切换到另一个任务)。

然而阻塞使这个问题发生了变化,如果某个任务或者线程阻塞了,导致不能继续执行,那么我们可以说这个任务或者线程阻塞了。如果没有并发,那么整个程序都将停止下来。

并发在此时就发挥它的作用,当一个任务阻塞的时候,程序中其他任务还可以继续执行。(如果没有任务阻塞,那么单处理器机器上使用并发就没有任何意义。)

  2、改进代码设计

  在单cpu机器上使用多任务的程序在任意时刻仍旧只在执行一项工作,因此从理论上讲,肯定可以不用任何任务而编写出相同的程序。但是, 并发提供了一个重要的组织结构上的好处:你的程序设计可以极大地简化。

某些类型的问题,例如仿真,没有并发的支持很难解决。

  解决这个问题的典型方式是使用协作多线程。java的线程机制是抢占式,这表示调度机制会周期性地中断线程,将上下文切换到另一个进程,从而为每个线程都提供时间片,使得每个线程都会分配到数量合理的时间去驱动它的任务。

在协作式系统中,每个任务都会自动地放弃控制,这要求程序要有意识地在每个任务中插入某个类型的让步语句。

  协作式系统的优势是双重的:上下文切换的开销通常比抢占式系统要低廉许多,而且对可以同时执行线程数量在理论上是没有限制。

  并发需要付出代价,包含复杂性大家,但是这些代价与在程序设计、资源负载均衡以及用户方便使用方面相比,就显得微不足道了。通常,线程是你能够创建更加松散耦合的设计,

否则,你的代码中各个部分都必须显式地关注那些通常可以由线程来处理的任务。

 

最后:

JAVA的线程可以在多个CPU上运行么?

  "在具有多个处理器的机器上,每一个处理器运行一个线程,可以有多个线程并行运行。当然,如果线程的数目多于处理器的数目,调度器依然采用时间片机制"。

posted @ 2017-09-25 16:24  Auler  阅读(266)  评论(0编辑  收藏  举报