什么是并发
并发指的在操作系统中,是指一个时间段中有几个程序都处于已启动运行到运行完毕之间,且这几个程序都是在同一个处理机上运行,但任一个时刻点上只有一个程序在处理机上运行。
并发和并行是十分容易混淆的概念。并发指的是多个任务交替进行,而并行则是指真正意义上的“同时进行”。实际上,如果系统内只有一个CPU,而使用多线程时,那么真实系统环境下不能并行,只能通过切换时间片的方式交替进行,而成为并发执行任务。真正的并行也只能出现在拥有多个CPU的系统中。
为什么要用到并发(优点)
并发处理的广泛应用是Amdahl定律代替摩尔定律成为计算机性能发展源动力的根本原因,也是人类压榨计算机运算能力的最强有力武器。 ——《深入理解java虚拟机 第三版》
我们都知道,计算机包括很多模块,例如运算模块,通信模块,存储模块,这其中运算模块即CPU的能力太强大了,以至于计算机大部分时间都花在磁盘IO,网络通信等事情上。如果不希望CPU大部分时间都在等待其他资源,那么最容易想到的办法就是,让它在等待的时间去做别的事情,即同时处理几项任务。
回到本章刚开始引用的话,我们都知道,按照摩尔定律的预测,我们的计算能力会按照指数级别的速度增长。然而,近几年摩尔定律失效,聪明的硬件工程师为了进一步提升计算速度,不再追求单独的计算单元,而是将多个计算单元整合到了一起,也就是形成了多核CPU。短短十几年的时间,家用型CPU,比如Intel i7就可以达到4核心甚至8核心。因此,摩尔定律似乎在CPU核心扩展上继续得到体验。因此,多核的CPU的背景下,催生了并发编程的趋势,通过并发编程的形式可以将多核CPU的计算能力发挥到极致,性能得到提升。
另外,在特殊的业务场景下先天的就适合于并发编程。比如当我们在网上购物时,为了提升响应速度,需要拆分,减库存,生成订单等等这些操作,就可以进行拆分利用多线程的技术完成。面对复杂业务模型,并行程序会比串行程序更适应业务需求,而并发编程更能吻合这种业务拆分 。
综上:并发编程具有以下优点:
并发编程的形式可以将多核CPU的计算能力发挥到极致,性能得到提升。
面对复杂业务模型,并行程序会比串行程序更适应业务需求,而并发编程更能吻合这种业务拆分。
而在在实习与秋招面试过程中,也会多次问到java并发相关问题,小编自己也零零星星的看了很多视频和技术博客。但苦于这部分对于小白来说,确实理解起来有一定难度,且网上众多资料不够系统,同时很多错误且抄袭严重。 本文就给大家分享一份非常不错的学习并发的文档。
本文档有以下特点:
- 第一,脉络清晰,内容全面。从执行器框架到流API,从并发数据结构到同步机制,从程序设计到调试测试,基本上所有与并发程序设计相关的内容都有所涉及。全书主线明晰,阅读起来比较轻松。
- 第二,语言通俗,举例充分。教科书式的语言相对较少,原理通俗易懂,实例简洁明了。几乎针对每个重要的知识点都提供了足够的代码示例,使得学习和练习都很方便。
- 第三,面向应用,便于上手。作者的视角并不是停留在并发编程本身,而是在于如何使用并发编程解决实际问题以及提高处理效能。读者不需要深陷于原理本身,宜结合实际各取所需,而且书中的示例也都很实用。
目录
本书内容
第1章,“第一步:并发设计原理”。这一章将介绍并发应用程序的设计原理。你还将了解到并发应用程序可能出现的问题,以及设计并发应用程序的方法论,同时还会学到一些设计模式、提示和技巧。
第2章,“使用基本元素: Thread和Runnable”。这一章将解释如何采用Java语言中最基本的元素(Runnable接口和Thread类)来实现并发应用程序。有了这些元素,你可以创建一个可与实际执行线程并行执行的新执行线程。
第3章,“管理大量线程:执行器”。这一章将介绍执行器框架的基本原理。该框架让你能够使用大量的线程,而无须创建或管理它们。你将实现k-最近邻算法和一个基本的客户端/服务器应用程序。
第4章,“充分利用执行器"。这一章将探讨执行器的一些高级特性,包括为了在一段延迟之后或每隔一定时间执行任务而进行的任务撤销和调度。你将实现一个高级客户端/服务器应用程序和一个新闻阅读器。
第5章,“从任务获取数据:callable接口与Future接口”。这一章将介绍如何在执行器中处理采用callable与Future接口返回结果的任务。你将实现一个最佳匹配算法以及一个构建倒排索引的应用程序。
第6章,“运行分为多阶段的任务: Phaser类”。这一章将介绍如何使用Phaser类来并发执行那些可分为多个阶段的任务。你将实现关键字抽取算法和遗传算法。
第7章,“优化分支解决方案:Fork/Join框架”。这一章将介绍如何使用一种特殊的执行器,该执行器针对可以使用分治法解决的问题进行了优化,这就是Fork/Join框架及其工作窃取( work-stealing )算法。你将实现k-means聚类算法、数据筛选算法以及归并排序算法。
第8章,“使用并行流处理大规模数据集:MapReduce模型”。这一章将介绍如何采用流来处理大规模数据集。你将学习如何使用流API和更多的流函数来实现MapReduce应用程序。你将实现一个数值汇总算法和一个信息检索工具。
第9章,“使用并行流处理大规模数据集:MapCollect模型"。这一章将探讨如何使用流API中的collect()方法对数据流执行可变约简(mutable reduction)操作,将其转换为一种不同的数据结构,包括在collectors类中预定义的一些收集器。你将实现一个无须建立索引就能够搜索数据的工具、一个推荐系统,以及计算社交网络中两个人的共同联系人列表的算法。
第10章,“异步流处理:反应流"。这一章将解释如何使用反应流来实现并发应用程序,而反应流则为带有非阻塞回压的异步流处理定义了标准。这种流的基本原理在官方网站的Reactive Streams介绍页面上有明确说明,而Java9为其实现提供了必要的基础接口。
第11章,“探究并发数据结构和同步工具”。这一章将介绍如何使用最重要的并发数据结构(可用于并发应用程序而不会导致数据竞争条件的数据结构),以及Java并发API中用于组织任务执行的所有同步机制。
第12章,“测试与监视并发应用程序"。这一章将介绍如何获得Java并发API元素(线程、锁、执行器等)的状态信息。你还将学习如何使用JConsole应用程序来监视并发应用程序,以及如何使用MultithreadedTC库和Java Pathfinder应用程序来测试并发应用程序。
第13章,“JVM中的并发处理:Clojure、带有Gpars库的Groovy以及Scala”。这一章将介绍如何使用面向Java虚拟机的其他编程语言来实现并发应用程序。你将学习如何使用Clojure、Scala以及带有Gpars库的Groovy等编程语言所提供的并发元素。
如果你是了解并发编程基本原理的Java开发人员,同时又想成为Java并发API的专家型用户,以便开发出能够充分利用计算机全部硬件资源的最优化应用程序,那么本书就非常适合你。