顺序编程可以解决大部分问题,但是对于某些问题如果能并发,则会非常方便甚至必要。
熟练掌握并发编程理论和技术,是对知识的一种飞跃,也是通向高级的中介。
并发具有可论证的确定是,但是实际上具有不可确定性。在实际情况中,更容易发生的情况是所编写的并发程序在给定适当条件的时候,将会工作失败。
并发看起来充满危险,如果对它有些恐惧,可能是好事。JAVA是一种多线程语言,提出了并发问题,如果没有意识到并发问题,可能最终会认为问题出在其他什么地方,而不在你软件中。如果程序被迁移到多处理器系统中,这种种类的问题还会被暴露或放大。基本上,了解并发可以使你意识到正确的程序可能会展示出不正确的行为。
要想掌握并发编程的实质,需要深入学习和理解。
实现并发最直接的方式是在操作系统界别使用进程。进程运行在自己的地址空间内的自包容的程序。操作系统会将进程相互隔离开,不会彼此干涉。但是进程通常会有数量和开销的限制,以避免在不同的并发系统之间的可应用性。
某些编程语言被设计为并发任务彼此隔离,这些语言通常称为函数型语言,每个函数调用不会产生任何副作用(不能干涉其他函数)。Erlang就是这样的语言。
JAVA采取传统方式,在顺序语言基础上提供对线程的支持。JAVA的线程机制是抢占式的,表示调度机制会周期性的中断线程,将上下文切换到另一个现场,从而为每个现场提供时间片,是的每个现场都会分配到数量合理的时间去驱动它的任务。
并发需要付出代码的,包含复杂性代价,不过和程序设计、资源负载均衡以及用户方便使用方面的改进相比,就显得微不足道了。
1 概念
并发和并行的区别就是一个处理器同时处理多个任务和多个处理器或者是多核的处理器同时处理多个不同的任务.
前者是逻辑上的同时发生(simultaneous),而后者是物理上的同时发生.
并发性 (concurrency),又称共行性,是指能处理多个同时性活动的能力,并发事件之间不一定要同一时刻发生.
并行 (parallelism) 是指同时发生的两个并发事件,具有并发的含义,而并发则不一定并行.
1.1 并发阶段
JAVA并行的3个发展阶段
第一阶段:Thread ,Runable
第二阶段:Executor框架
第三阶段: ForkJoin并行框架
1.1.1 传统的并发编程(Thead、Runable)
看到最多的就是继承Thread类或者继承Runable接口。并发通常是用在提高单核机器的程序性能上。
1.1.2 Executor框架
Executor框架是指java 5中引入的一系列并发库中与executor相关的一些功能类,其中包括线程池,Executor,Executors,ExecutorService,CompletionService,Future,Callable等。
Executor用来管理Runable对象的执行。用来创建并管理一组Runable对象的线程,这组线程就叫做线程池(Thread pool)
并发编程的一种编程方式是把任务拆分为一些列的小任务,即Runnable,然后在提交给一个Executor执行,Executor.execute(Runnalbe) 。Executor在执行时使用内部的线程池完成操作。
1.1.3 ForkJoin并行框架
Fork/Join框架是Java7提供了的一个用于并行执行任务的框架, 是一个把大任务分割成若干个小任务,最终汇总每个小任务结果后得到大任务结果的框架。
监控JAVA的性能工具JVMTOP
Jvmtop下载地址:
http://wiki.scn.sap.com/wiki/download/attachments/337414060/jvmtop.zip?api=v2
配置JAVA_HOME,CLASSPATH变量后,
可以运行jvmtop.bat